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

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

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

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

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

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

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



답변

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

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


답변

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

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

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

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


답변

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

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

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

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


답변

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." }


답변

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


답변

내 솔루션 :

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})


답변

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

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

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