При вызове sureIndex с составным ключом в поле _id объекта index - PullRequest
3 голосов
/ 26 октября 2011

Когда я вызываю sureIndex из оболочки mongo в коллекции для составного индекса, в объекте индекса автоматически создается поле _id типа ObjectId.

> 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 sureIndex для той же коллекции *, тамне является _id свойством *.

Глядя на исходный код morphia, становится ясно, что он вызывает тот же код, который использует оболочка, но по какой-то причине (будь то факт, что я создаю составной индекс или индексирую встроенный документ, или и то, и другое)они дают разные результаты.Кто-нибудь может объяснить мне это поведение?

1 Ответ

1 голос
/ 26 октября 2011

Не совсем точно, как вам удалось получить поле _id в коллекции индексов, но как shell, так и Morphia инициировали вызовы sureIndex для составных индексов, которые не помещают поле _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 или более раннюю версию.

...