是否可以为嵌入文档中的键设置唯一键?
我有一个Users集合,其中包含以下示例文档:
{
Name: "Bob",
Items: [
{
Name: "Milk"
},
{
Name: "Bread"
}
]
},
{
Name: "Jim"
},
Run Code Online (Sandbox Code Playgroud)
有没有办法在属性Items.Name上创建索引?
我尝试创建索引时出现以下错误:
> db.Users.ensureIndex({"Items.Name": 1}, {unique:true});
E11000 duplicate key error index: GroceryGuruApp.Users.$Items.Name_1 dup key: {
: null }
Run Code Online (Sandbox Code Playgroud)
有什么建议?谢谢!
小智 7
您可以创建一个唯一的复合稀疏索引来完成您希望的内容.它可能不是最好的选择(客户端可能仍然可能更好),但它可以根据具体要求做你要求的.
要做到这一点,你需要创建Name: Bob与每个顶级记录唯一相同级别的另一个字段(可以执行FirstName + LastName + Address,我们将调用此密钥Identifier).
然后创建一个这样的索引:
ensureIndex({'Identifier':1, 'Items.name':1},{'unique':1, 'sparse':1})
Run Code Online (Sandbox Code Playgroud)
稀疏索引将忽略没有该字段的项目,因此应该解决您的NULL密钥问题.将您的唯一标识符和Items.name作为复合唯一索引组合在一起,应确保每个人不能拥有两次相同的项目名称.
虽然我应该补充一点,我只和Mongo一起工作了几个月,而我的科学可能会被淘汰.这不是基于经验证据,而是基于观察到的行为.