Встроенный массив как набор (в смысле математики) в коллекции монго - PullRequest
1 голос
/ 23 марта 2012

«Схема» для объектов, которые я помещаю в коллекцию, выглядит примерно так:

{
    name : "Niranjan", //<--key
    children : ["Suraj", "kalidas", "Suraj"]
}

Но я хотел убедиться, что дети будут рассматриваться как набор - в приведенном выше примере я хотел Mongoне принимать запись, потому что «Сурадж» дважды появляется в массиве.

Я попытался создать уникальный индекс для имени и дочерних элементов

db.folks.ensureIndex({name:1,children:1},{unique:true})

Однако это означает, что он делаетглобально уникальный индекс для любого дочернего имени + народного имени.То есть, если у меня также нет уникального индекса по имени, я смогу сделать следующее:

db.folks.insert({name:'p',children:['c1','c2']})
db.folks.insert({name:'p',children:['c3']})

, потому что p + c1, p + c2 и p + c3 различны.Если я попытался вставить следующее:

db.folks.insert({name:'p',children:['c4','c1']})

, тогда я получу

E11000 duplicate key error index: test.folks.$name_1_children_1  dup key: { : "p", : "c1" }

Есть ли способ добиться этого без выполнения проверки во время вставки, как в /5840214/unikalnye-znacheniya-massiva-v-mongoose?

1 Ответ

2 голосов
/ 23 марта 2012

Уникальные индексы будут действовать так, как вы ожидаете в будущем выпуске MongoDB:

https://jira.mongodb.org/browse/SERVER-1068

На данный момент вам необходимо проверить уникальность в вашем приложении перед вставкой.

Кстати, когда вы обновляете документы, вы можете использовать $ addToSet вместо $ push для обеспечения уникальности:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24addToSetand%24each

...