6
我們假設這是代表客戶的文檔。mongodb索引嵌入字段(點符號)
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: '[email protected]'},
{name: 'Jessica', email: '[email protected]'}
]
}
我想定義一個唯一索引pocs.email
所以我發出以下命令:
db.things.ensureIndex({"pocs.email": 1}, {unique: true})
奇怪的是,嘗試添加另一家公司用POC有一個電子郵件地址已存在時在另一家公司,mongo拒絕這一點,尊重獨特的索引約束。
也就是說,以下情況不能存在:
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: '[email protected]'},
{name: 'Jessica', email: '[email protected]'}
]
},
{
company_name: 'contoso llc',
pocs: [
{name: 'Paul', email: '[email protected]'},
]
}
這很好。然而,在同一文檔中可能有重複的poc,例如,
{
company_name: 'corporate ltd.',
pocs: [
{name: 'Paul', email: '[email protected]'},
{name: 'Paul', email: '[email protected]'},
{name: 'Jessica', email: '[email protected]'}
]
},
看到我的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: '[email protected]'}]})
> db.test.insert({company: "contoso", poc: [{email: '[email protected]'}]})
E11000 duplicate key error index: test.test.$poc.email_1 dup key: { : "[email protected]" }
> ({company: "contoso", poc: [{email: '[email protected]'}, {email: '[email protected]'}]})
>
>
> db.test.find()
{ "_id" : ObjectId("4f44949685926af0ecf9295d"), "company" : "contoso", "poc" : [ { "email" : "[email protected]" } ] }
{ "_id" : ObjectId("4f4494b885926af0ecf9295f"), "company" : "contoso", "poc" : [ { "email" : "[email protected]" }, { "email" : "[email protected]" } ] }
而且,這種情況無論是在insert
或update
。
> db.test.update({"_id" : ObjectId("4f44949685926af0ecf9295d")}, {$push: { poc: {email: '[email protected]'}}})
> db.test.find()
{ "_id" : ObjectId("4f4494b885926af0ecf9295f"), "company" : "contoso", "poc" : [ { "email" : "[email protected]" }, { "email" : "[email protected]" } ] }
{ "_id" : ObjectId("4f44949685926af0ecf9295d"), "company" : "contoso", "poc" : [ { "email" : "[email protected]" }, { "email" : "[email protected]" }, { "email" : "[email protected]" } ] }
>
這是一個錯誤或一個通過設計特徵我錯過了文檔中的點滴?
+1。它被認爲是一個錯誤,但是很奇怪。 「唯一的索引被設計用來強制執行只有一個文檔擁有該密鑰 從技術上講,對於這種情況是這樣的,但在大多數人使用該功能的方式中,他們希望獨特的包含子文檔。我不知道他們是否可以解決這個問題,因爲這是一個非常大的語義變化,可能會咬人。 – Thilo 2012-02-22 08:04:25
@Thilo,我完全同意你的看法。如果他們接受它,它將會是一個巨大的變化,完全與獨特的索引應該是什麼性質相矛盾。大多數人誤解了嵌入/子文檔作爲真實文檔的概念。這是真正的問題。但是'嵌入式doc只是另一個領域(具有嵌套屬性),並且只具有與普通領域相同的特徵。如果他們明白這一點,這些問題就不會發生 – RameshVel 2012-02-22 08:22:51
@RameshVel或許這是一個觀點問題,而不是[誤解]理解概念。請參閱,如果嵌套數組有N個項目,則索引表中現在有N個條目,每個條目有一個條目。不像「唯一索引的性質」,它爲每個記錄的每個索引定義創建單個條目。 除此之外,如果我們要取出子文檔並將它們放在一個單獨的集合中,那麼我們回到了從傳統的RDBMS中知道的加入地獄。 – 2012-02-22 09:23:54