80

次のようなクエリを実行するときに、mongodbが「_id」フィールドをどのように比較するのだろうか。

db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);

ID のタイムスタンプ部分のみに基づいていますか?

4

3 に答える 3

66

アンドレが言ったことを少し拡張するには:

ObjectID のタイムスタンプは秒までしかないため、同じ値のタイムスタンプ (最初の 4 バイト) を使用して 2 つ (またはそれ以上) の ObjectID を簡単に作成できます。これらが同じマシン (マシン ID - 次の 3 バイト) で同じプロセス (PID - 次の 2 バイト) によって作成された場合、それらを区別する唯一のものは「inc」フィールド、最後の 3 バイトです。最後に。

更新: 2020 年 1 月

この回答は引き続き人気があるため、少し更新する価値があります。この回答が 8 年前に書かれて以来、ObjectID 仕様は進化しており、タイムスタンプの後の 5 バイトは単純にランダムになり、衝突の可能性が大幅に減少します。最後の 3 バイトは引き続きインクリメンタルですが、ランダムな値で初期化されて開始されるため、衝突の可能性が低くなります。ObjectID に含まれるコンテキストが少なくなりました (どこでどのプロセスによって生成されたかを簡単に知ることはできません) が、この情報は意味のある方法で使用されておらず、ID のランダム化を改善するために非推奨になっていると思います。

更新終了

完全な仕様については、こちらを参照してください。

https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification

もちろん、仕様が正しく実装されていると仮定すると、その「inc」フィールドは、常に増加するフィールド(ソートが挿入/作成順序であると合理的に期待できます)またはランダム値(おそらく一意ですが、順序付けられていません)のいずれかです。 . ObjectID は、MongoDB 自体ではなく、ドライバーまたはアプリケーション (または実際には手動) によって生成される可能性があることに注意してください。そのため、生成方法を完全に制御できない場合は、上記のいずれかまたはすべてが適用される可能性があります。

于 2012-08-23T21:11:43.643 に答える
33

ある意味であなたが正しいのは、で_idソートすると、挿入時間でソートされます。これは、タイムスタンプ部分でのみ比較が行われるという意味ではありません。ObjectID は、それ自体が BSON オブジェクト タイプであり、互いに直接比較できます。タイムスタンプで始まるため、論理的には、過去のものは将来のものよりも少なくなります。

ドキュメントで詳細を確認できます

于 2012-08-23T19:51:36.167 に答える