2011-10-26 8 views
2

複合インデックスのコレクションのmongoシェルからensureIndexを呼び出すと、ObjectIdタイプの_idフィールドがインデックスオブジェクト内で自動生成されます。複合オブジェクトキーを使用したensureIndexの呼び出しインデックスオブジェクトの_idフィールドの結果

> db.system.indexes.find(); 
{ "name" : "_id_", "ns" : "database.coll", "key" : { "_id" : 1 } } 
{ "_id" : ObjectId("4ea78d66413e9b6a64c3e941"), "ns" : "database.coll", "key" : { "a.b" : 1, "a.c" : 1 }, "name" : "a.b_1_a.c_1" } 

コレクション内のすべての文書は、_idフィールドを必要とするので、これは(右、でもsystem.indexes?)直感的に理にかなって、私は同じコレクションのためのmorphiaのensureIndexの呼び出しによって生成されたインデックスをチェックするとき*なしあり_idプロパティ*。

morphiaのソースコードを見ると、シェルが使用するのと同じコードが呼び出されていることは明らかですが、何らかの理由で(複合インデックスを作成しているか、埋め込みドキュメントのインデックスを作成しているか、異なる結果。誰も私にこの行動を説明することはできますか?

答えて

1

ないあなたはインデックスコレクションに_idフィールドを得ることができたが、シェルとMorphiaの両方が複合インデックスは、インデックスオブジェクトに_idフィールドを配置しないためensureIndex呼び出し発祥正確にどのように確認してください:

> db.test.ensureIndex({'a.b':1, 'a.c':1}) 
> db.system.indexes.find({}) 
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.test", "name" : "_id_" } 
{ "v" : 1, "key" : { "a.b" : 1, "a.c" : 1 }, "ns" : "test.test", "name" : "a.b_1_a.c_1" } 
> 

へのアップグレード2.xを使用している場合は、古いバージョンを実行しています。あなたの出力から判断すると、1.8またはそれ以前のバージョンを実行しています。

+0

モルフォが作成していたmongodのバージョンは、シェルが接続していたバージョンよりも新しいバージョンでした。 brewは古代の1.6.3をインストールし、mongoコマンドは以前のバージョンの$ PATHにそのバージョンを当てていました。あなたは行く; – jpredham

+0

) –

関連する問題