web-dev-qa-db-ja.com

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コマンドラインクエリがあれば、教えてください。

84
inkriti

これは前の回答の再ハッシュですが、異なるmongodbバージョンで動作する可能性が高くなります。

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

これにより、collectionの最後のドキュメントが1つ作成されます。

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

$natural:-1は、レコードが挿入される順序と逆の順序を意味します。

編集:すべてのダウンボッターについて、上記はMongoose構文であり、mongo CLI構文はdb.collectionName.find({}).sort({$natural:-1}).limit(1)です。

27
dark_ruby

一定時間応答のクエリが必要です

デフォルトでは、MongoDBのインデックスはBツリーです。 Bツリーの検索はO(logN)操作であるため、find({_id:...})でさえ一定の時間、O(1)応答を提供しません。

つまり、IDにObjectIdを使用している場合は、_idでソートすることもできます。 詳細はこちらを参照 。もちろん、それでも最後までは良いことです。

「2回書く」ことに頼ることができます。メインコレクションに1回書き込み、「最終更新」コレクションに再度書き込みます。トランザクションがなければ、これは完全ではありませんが、「最終更新」コレクション内のアイテムが1つだけの場合、常に高速になります。

20
Gates VP

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に基づいて、すべてのドキュメントの降順で投影を定義します。

Sorted Projection(_id:reverse order):コレクションから最新の(最後の)ドキュメントを取得します。

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

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

1
Sam

ドキュメントで自動生成されたMongo Object Idを使用している場合、最初の4バイトとしてタイムスタンプが含まれ、コレクションに挿入された最新のドキュメントが使用されます。私はこれが古い質問であることを理解していますが、誰かがまだここで別の選択肢を探している場合。

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

上記のクエリは、コレクションに挿入された最新のドキュメントの_ idを返します

0
Chan15

私のソリューション:

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

0