mongodb 컬렉션에서 최신 기록 가져 오기


99

컬렉션의 가장 최근 기록을 알고 싶습니다. 그렇게하는 방법?

참고 : 다음 명령 줄 쿼리가 작동한다는 것을 알고 있습니다.

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

여기서 idate에는 타임 스탬프가 추가됩니다.

문제는 수집이 더 오래 데이터를 되 찾는 시간이고 내 '테스트'수집이 정말 엄청나다는 것입니다. 일정한 시간 응답이있는 쿼리가 필요합니다.

더 나은 mongodb 명령 줄 쿼리가 있으면 알려주세요.

답변:


138

이것은 이전 답변의 재 해시이지만 다른 mongodb 버전에서 작동 할 가능성이 더 큽니다.

db.collection.find().limit(1).sort({$natural:-1})

10
db.collection.find().limit(1).sort({$natural:-1}).pretty()멋지게
— Anthony

그래서,이 순서의 차이는 무엇 :db.collection.find().sort({$natural:-1}).limit(1).pretty()
— 레오

@Digits 끝에 제한을두면 출력을 하나의 문서로만 제한하고 컬렉션의 최상위 문서 여야 할 때 마지막 레코드를 가져 오는 방식도 성능에 어떤 영향을 미칠까요?
— kailash yogeshwar 2016

좋은 대답입니다. 나는이 같은 시도 : ( "이름 모음") db.collection를 찾을 수 있습니다 ({}, {제한 : 1}) 종류 ({자연 $ : -1})..
— 압둘 알림 Shakir

AWS DocDB를 사용하는 모든 사용자 : Query failed with error code 303 and error message 'option $natural is not supported' on server docdb. 이 기능이 곧 제공되기를 바랍니다.
— Marc

34

이것은 당신에게 마지막 문서를 제공합니다 collection

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1 레코드가 삽입 된 순서와 반대 순서를 의미합니다.

편집 : 모든 반대 투표자에 대해 위는 Mongoose 구문이고 mongo CLI 구문은 다음과 같습니다.db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
구문이 잘못된 것 같습니다. 나는 당신이 가지고있는 것처럼 그것을 작동시킬 수 없습니다. 작동하는 것은 'db.punchdeck.findOne ({$ query : {}, $ orderby : {$ natural : -1}})'
— Dave Lowerre

확실하지, 왜 모든 downvotes -이 코드는 나를 위해 완벽하게 작동하고, 빠른
— dark_ruby

2
@dark_ruby You query returns error "$ err": "Canonicalize query : BadValue Unsupported projection option : sort : {$ natural : -1.0}",
— Roman Podlinov

20

일정한 시간 응답이있는 쿼리가 필요합니다.

기본적으로 MongoDB의 인덱스는 B- 트리입니다. B- 트리 검색은 O (logN) 작업이므로 find({_id:...})일정한 시간, O (1) 응답도 제공하지 않습니다.

즉, ID를 _id사용 하는 경우 별로 정렬 할 수도 있습니다 ObjectId. 자세한 내용은 여기를 참조하십시오 . 물론 그것도 마지막 순간까지만 좋다.

당신은 "두 번 쓰기"에 의지 할 수 있습니다. 메인 컬렉션에 한 번 쓰고 "마지막 업데이트"컬렉션에 다시 씁니다. 트랜잭션이 없으면 완벽하지는 않지만 "마지막 업데이트"컬렉션에 하나의 항목 만 있으면 항상 빠릅니다.


2
대부분 데이터 크기가 매우 커질 때 카운트 보유자를 위해 "두 번 작성"을 옹호하는 noSQL 및 MongoDB 솔루션을 많이 봅니다. 이것이 일반적인 관행이라고 생각합니까?
— 비니

MongoDB는 디스크로 자주 플러시되지 않으며 트랜잭션이 없으므로 쓰기가 훨씬 빨라집니다. 여기서 절충점은 종종 다중 쓰기로 이어지는 데이터를 비정규 화하는 것이 좋습니다. 물론 10 배 또는 100 배 쓰기 처리량 (내가 본 것)을 얻는다면 쓰기 2 배 또는 3 배는 여전히 큰 개선입니다.
— Gates VP

13

MongoDB 컬렉션에서 마지막 항목을 가져 오는 또 다른 방법입니다 (예제에 대해서는 신경 쓰지 마십시오).

> db.collection.find().sort({'_id':-1}).limit(1)

일반 투영

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

정렬 된 투영 (_id : 역순)

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

sort({'_id':-1})는 _ids를 기준으로 모든 문서의 내림차순으로 투영을 정의합니다 .

정렬 된 투영 (_id : 역순) : 컬렉션에서 최신 (마지막) 문서 가져 오기.

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

2

php7.1 mongoDB :
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);



0

문서에서 자동 생성 된 Mongo 개체 ID를 사용하는 경우 컬렉션에 삽입 된 최신 문서를 찾을 수있는 처음 4 바이트로 타임 스탬프를 포함합니다. 나는 이것이 오래된 질문이라는 것을 이해하지만 누군가가 여전히 여기에서 다른 대안을 찾고 있다면.

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

위의 쿼리는 컬렉션에 삽입 된 최신 문서 의 _id 를 제공합니다.


0

"foo"컬렉션의 모든 MongoDB 문서에서 마지막 레코드 를 가져 오는 방법 입니다 (foo, x, y .. 등 변경).

db.foo.aggregate([{$sort:{ x : 1, date : 1 } },{$group: { _id: "$x" ,y: {$last:"$y"},yz: {$last:"$yz"},date: { $last : "$date" }}} ],{   allowDiskUse:true  })

그룹에서 추가하거나 제거 할 수 있습니다.

도움말 문서 : https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

https://docs.mongodb.com/manual/reference/operator/aggregation/last/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.