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

时间:2011-10-26 05:23:16

标签: 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" : 1, "a.c" : 1 }, "name" : "a.b_1_a.c_1" }

这很直观,因为集合中的所有文档都需要一个_id字段(甚至是system.indexes,对吧?),但是当我检查由morphia对相同集合*的ensureIndex调用生成的索引时,没有_id属性*。

看看morphia的源代码,很明显它调用了shell使用的相同代码,但出于某种原因(无论是我创建复合索引还是索引嵌入式文档或两者兼而有之)它们产生的不同结果。任何人都可以向我解释这种行为吗?

1 个答案:

答案 0 :(得分:1)

不完全确定你是如何设法在索引集合中获取_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或更早。