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.