8

これが私のコレクション構造の場合:

{ _id: ObjectId("4fdbaf608b446b0477000142"), name: "product 1" }
{ _id: ObjectId("4fdbaf608b446b0477000143"), name: "product 2" }
{ _id: ObjectId("4fdbaf608b446b0477000144"), name: "product 3" }

製品 1 を照会した場合、次のドキュメント (この場合は「製品 2」) を照会する方法はありますか?

4

3 に答える 3

19

sort()予測可能な結果の順序が必要な場合は、明示的な基準を追加することをお勧めします。

求めている順序が「挿入順序」であり、MongoDB のデフォルトで生成された ObjectId を使用していると仮定すると、ObjectId に基づいてクエリを実行できます。

// Find next product created
db.products.find({_id: {$gt: ObjectId("4fdbaf608b446b0477000142") }}).limit(1)

この例は、次の理由でのみ機能することに注意してください。

  • ObjectId の最初の 4 バイトは、UNIX スタイルのタイムスタンプから計算されます (参照: ObjectId Specification )
  • _id単独でのクエリは、デフォルトの_idインデックス (ID でソート) を使用して一致を見つけます。

つまり、この暗黙の並べ替えは次と同じです。

db.products.find({_id: {$gt: ObjectId("4fdbaf608b446b0477000142" )}}).sort({_id:1}).limit(1);

「次の」製品 (たとえば、a category) を検索する方法を限定するためにクエリにさらに条件を追加した場合、クエリは別のインデックスを使用する可能性があり、順序が期待どおりにならない可能性があります。

Explain()でインデックスの使用状況を確認できます。

于 2012-08-18T07:11:31.230 に答える
0

ObjectId を使用して、アイテムを挿入順に戻すことができます。参照: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs

他の順序でそれらを取得したい場合は、その順序を定義し、ドキュメントにより多くの情報を保存する必要があります。

于 2012-08-17T20:24:53.703 に答える