Давайте предположим, что это документ, представляющий клиента.
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: 'paul@corporate.com'},
{name: 'Jessica', email: 'jessica@corporate.com'}
]
}
Я хотел определить уникальный индекс для pocs.email
Поэтому я ввел следующую команду:
db.things.ensureIndex({"pocs.email": 1}, {unique: true})
Странно то, что при попытке добавить другую компанию с документом, имеющим адрес электронной почты, уже существует в другой компании, Монго отклоняет это, соблюдая ограничение уникального индекса.
, то есть следующее не может существовать:
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: 'paul@corporate.com'},
{name: 'Jessica', email: 'jessica@corporate.com'}
]
},
{
company_name: 'contoso llc',
pocs: [
{name: 'Paul', email: 'paul@corporate.com'},
]
}
Что хорошо.Однако возможно наличие дублирующего документа в одном документе, например,
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: 'paul@corporate.com'},
{name: 'Paul', email: 'paul@corporate.com'},
{name: 'Jessica', email: 'jessica@corporate.com'}
]
},
см. Последовательность моих команд cli ниже:
> version()
version: 2.0.2
>
> use test
switched to db test
> db.test.ensureIndex({"poc.email": 1}, {unique: true})
>
> db.test.insert({company: "contoso", poc: [{email: 'me@comapny.com'}]})
> db.test.insert({company: "contoso", poc: [{email: 'me@comapny.com'}]})
E11000 duplicate key error index: test.test.$poc.email_1 dup key: { : "me@comapny.com" }
> ({company: "contoso", poc: [{email: 'me.too@comapny.com'}, {email: 'me.too@company.com'}]})
>
>
> db.test.find()
{ "_id" : ObjectId("4f44949685926af0ecf9295d"), "company" : "contoso", "poc" : [ { "email" : "me@comapny.com" } ] }
{ "_id" : ObjectId("4f4494b885926af0ecf9295f"), "company" : "contoso", "poc" : [ { "email" : "me.too@comapny.com" }, { "email" : "me.too@company.com" } ] }
Более того, это происходит либо в insert
, либо в update
.
> db.test.update({"_id" : ObjectId("4f44949685926af0ecf9295d")}, {$push: { poc: {email: 'me@company.com'}}})
> db.test.find()
{ "_id" : ObjectId("4f4494b885926af0ecf9295f"), "company" : "contoso", "poc" : [ { "email" : "me.too@comapny.com" }, { "email" : "me.too@company.com" } ] }
{ "_id" : ObjectId("4f44949685926af0ecf9295d"), "company" : "contoso", "poc" : [ { "email" : "me@comapny.com" }, { "email" : "me@company.com" }, { "email" : "me@company.com" } ] }
>
Это ошибка или by-design-feature Я пропустил поиск в документации?