Mongo DBのObjectIdの使用に少し混乱しています。確かに、他のクライアント側で作成されたIDとほとんど競合しないIDをクライアント側で作成するのに最適です。しかし、mongoはそれらを特別な方法で保存しているようです。 IDの文字列表現の保存は、オブジェクトIDをオブジェクトとして保存することとはdifferentです。どうしてこれなの?
文字列形式には、オブジェクト形式と同じ情報がすべて含まれていませんか?なぜmongoはこれらの2つの形式を区別するためにそのような長さになりますか?たとえば、フロントエンドから送信された_idを比較しようとすると、それは私を台無しにします。私のデータベースは、文字列形式のIDとオブジェクト形式のIDのどちらを格納するかについて一貫性がなく、コードが部分的に非難されることは確かです。
これがおかしいのは間違っていますか?なぜmongoはこのようにしていますか?
私は個人的に、あなたのコードを非難します。正しい方法でコーディングすることにより、アプリケーションでこの問題を完全に回避できます。比較するためにコードで文字列に変換し、ObjectId
のように見えるものが実際にObjectId
として使用されるようにします。
ObjectId
( http://docs.mongodb.org/manual/reference/object-id/ )と16進数表現の間には実際には12があることに注意してください。 ObjectId
は12バイトで、16進表現は24バイトです。
ストレージの効率だけでなく、インデックスについても同様です。小さいだけでなく、ObjectId
を特別な方法で使用して、インデックスの一部のみがロードされるようにすることができるためです。使用される部品。これは、一意性を確保するためにそのインデックスの最新部分のみをロードする必要がある挿入時に最も顕著になります。 16進表現では、このような動作を保証できません。
OjbectId
の16進表現を使用しないことを強くお勧めします。 「あなたの人生をもっと楽にしたい」なら、別の_id
これは小さくなりますが、なんとなくユニークでインデックスフレンドリーです。
ObjectId
は、内部に格納されている場合は12バイトであり、16進文字列表現よりもコンパクトです。 2つは異なるものです。
DB全体をリフローして、統一された_id
フィールドでこれを解決し、コードが同じ形式で保存されるようにします。 ObjectId
はMongoDBによって高速に生成されるため、新しいドキュメントを作成するときに使用します。