コレクション内の最新のレコードを知りたい。どうやってするか?
注:次のコマンドラインクエリが機能することは知っています。
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
の最後のドキュメントが1つ作成されます。
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にObjectId
を使用している場合は、_id
でソートすることもできます。 詳細はこちらを参照 。もちろん、それでも最後までは良いことです。
「2回書く」ことに頼ることができます。メインコレクションに1回書き込み、「最終更新」コレクションに再度書き込みます。トランザクションがなければ、これは完全ではありませんが、「最終更新」コレクション内のアイテムが1つだけの場合、常に高速になります。
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})
は、_id
sに基づいて、すべてのドキュメントの降順で投影を定義します。
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." }
php7.1 mongoDB:$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);
ドキュメントで自動生成されたMongo Object Idを使用している場合、最初の4バイトとしてタイムスタンプが含まれ、コレクションに挿入された最新のドキュメントが使用されます。私はこれが古い質問であることを理解していますが、誰かがまだここで別の選択肢を探している場合。
db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])
上記のクエリは、コレクションに挿入された最新のドキュメントの_ idを返します
私のソリューション:
db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})