2011-10-26 76 views
2

當我從複合索引的集合的mongo shell中調用ensureIndex時,索引對象中會自動生成ObjectId類型的_id字段。在索引對象的_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吧?),但是當我檢查由嗎啡的ensureIndex呼籲同一集合生成索引*沒有_id屬性*。

看看morphia的源代碼,很明顯它調用的是shell使用的相同代碼,但出於某種原因(無論是創建複合索引還是索引嵌入式文檔或兩者兼有)不同的結果。任何人都可以向我解釋這種行爲嗎?

回答

1

不清楚自己是如何設法在索引集合的_id字段,但兩者外殼和嗎啡起源ensureIndex要求複合索引,不要把_id字段在索引對象:

> 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

謝謝,這是正確的 - morphia創建索引的mongod版本是比shell連接的版本更高的版本。 brew安裝了古老的1.6.3,並且mongo命令早些時候在我的$ PATH中打了這個版本。 – jpredham

+0

你走了;) –

相關問題