web-dev-qa-db-ja.com

MongoDBでのObjectIdとその文字列形式の保存の違い

Mongo DBのObjectIdの使用に少し混乱しています。確かに、他のクライアント側で作成されたIDとほとんど競合しないIDをクライアント側で作成するのに最適です。しかし、mongoはそれらを特別な方法で保存しているようです。 IDの文字列表現の保存は、オブジェクトIDをオブジェクトとして保存することとはdifferentです。どうしてこれなの?

文字列形式には、オブジェクト形式と同じ情報がすべて含まれていませんか?なぜmongoはこれらの2つの形式を区別するためにそのような長さになりますか?たとえば、フロントエンドから送信された_idを比較しようとすると、それは私を台無しにします。私のデータベースは、文字列形式のIDとオブジェクト形式のIDのどちらを格納するかについて一貫性がなく、コードが部分的に非難されることは確かです。

これがおかしいのは間違っていますか?なぜmongoはこのようにしていますか?

33
B T

私は個人的に、あなたのコードを非難します。正しい方法でコーディングすることにより、アプリケーションでこの問題を完全に回避できます。比較するためにコードで文字列に変換し、ObjectIdのように見えるものが実際にObjectIdとして使用されるようにします。

ObjectIdhttp://docs.mongodb.org/manual/reference/object-id/ )と16進数表現の間には実際には12があることに注意してください。 ObjectIdは12バイトで、16進表現は24バイトです。

ストレージの効率だけでなく、インデックスについても同様です。小さいだけでなく、ObjectIdを特別な方法で使用して、インデックスの一部のみがロードされるようにすることができるためです。使用される部品。これは、一意性を確保するためにそのインデックスの最新部分のみをロードする必要がある挿入時に最も顕著になります。 16進表現では、このような動作を保証できません。

OjbectIdの16進表現を使用しないことを強くお勧めします。 「あなたの人生をもっと楽にしたい」なら、別の_idこれは小さくなりますが、なんとなくユニークでインデックスフレンドリーです。

24
Sammaye

ObjectIdは、内部に格納されている場合は12バイトであり、16進文字列表現よりもコンパクトです。 2つは異なるものです。

DB全体をリフローして、統一された_idフィールドでこれを解決し、コードが同じ形式で保存されるようにします。 ObjectIdはMongoDBによって高速に生成されるため、新しいドキュメントを作成するときに使用します。

6
bakkal