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()見栄えを良くしたい場合
アンソニー

だから、この順序との違いは何ですか:db.collection.find().sort({$natural:-1}).limit(1).pretty()
レオ

@Digitsは、出力を1つのドキュメントのみに制限し、それがコレクションの最上位のドキュメントでなければならない場合に、最後にレコードを取得する方法と、最後のレコードをフェッチする場合のパフォーマンスへの影響を示します。
kailash yogeshwar 2016年

素敵な答え。私はこのようにしてみました:db.collection( "コレクションの名前").find({}、{limit:1})。sort({$ natural:-1})
Abdul Alim Shakir

AWS DOCDBを使用した人のために:Query failed with error code 303 and error message 'option $natural is not supported' on server docdb。うまくいけば、その機能はすぐに来るでしょう。
マルク

33

これにより、 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

よくわかりません、なぜすべての反対投票-このコードは私にとって完璧に機能し、高速です
dark_ruby 14

2
@dark_rubyクエリはエラー "$ err"を返します: "クエリを正規化できません:BadValueサポートされていないプロジェクションオプション:ソート:{$ natural:-1.0}"、
Roman Podlinov

20

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

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

つまり、ID _idを使用している場合は、で並べ替えることもできObjectIdます。詳細はこちらをご覧ください。もちろん、それでも最後の1秒間だけで十分です。

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


2
多くのnoSQLおよびMongoDBソリューションが「2回書く」ことを推奨しているのがわかります。主にデータのサイズが非常に大きくなるときのカウントホルダー向けです。これは一般的な習慣だと思いますか?
Vinny

MongoDBは頻繁にディスクにフラッシュせず、トランザクションもないため、書き込みが大幅に高速化されます。ここでのトレードオフは、複数の書き込みにつながることが多いデータを非正規化することが推奨されることです。もちろん、書き込みスループットが10倍または100倍になった場合(私はこれを確認しました)、書き込みを2倍または3倍にしても、大幅に改善されます。
ゲイツ副社長

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

ソートされたプロジェクション(_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バイトとしてタイムスタンプが含まれています。これは古い質問であることは理解していますが、誰かがまだもう1つの選択肢を探してここにたどりついている場合。

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.