Mongodb 使用复合键调用ensureIndex会导致索引对象中的_id字段

Mongodb 使用复合键调用ensureIndex会导致索引对象中的_id字段,mongodb,morphia,Mongodb,Morphia,当我从mongo shell为复合索引的集合调用ensureIndex时,在索引对象中自动生成ObjectId类型的_id字段 > db.system.indexes.find(); { "name" : "_id_", "ns" : "database.coll", "key" : { "_id" : 1 } } { "_id" : ObjectId("4ea78d66413e9b6a64c3e941"), "ns" : "database.coll", "key" : { "a.b"

当我从mongo shell为复合索引的集合调用ensureIndex时,在索引对象中自动生成ObjectId类型的_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的源代码,很明显,它调用的代码与shell使用的代码相同,但出于某种原因(无论是我创建复合索引还是为嵌入文档编制索引,或者两者兼而有之),它们会产生不同的结果。有人能向我解释一下这种行为吗?

不太清楚您是如何在索引集合中获取_id字段的,但是shell和Morphia对复合索引的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或更早版本。

谢谢,这完全正确-morphia创建索引的mongod版本比shell连接的版本要晚。brew安装了古老的1.6.3,mongo命令在我的$PATH中较早地命中了该版本。