是否可以为嵌入文档中的键设置唯一键?
我有一个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)
有什么建议?谢谢!
情况: 我有几个相同集合(帐户)的文档,每个文档都有一个类型为array(string)的属性,名为uniquestrings.
问题: uniquestrings中的每个条目必须对mongodb中的所有文档都是唯一的.似乎MongoDB/Mongoose没有提供这样的验证(addToSet¹和index:{unique:true}²都没有解决问题).是否有一种模式来重构我的文档架构以确保mongodb本身可以验证它?目前,软件本身在更新文档之前检查它.
例如
account {
_id: 111,
uniquestrings: ["a", "b", "c"]
}
account {
_id: 222,
uniquestrings: ["d", "e", "f"]
}
Run Code Online (Sandbox Code Playgroud)
例如,account(222).uniquestrings.push("a");通过从mongo抛出重复错误来防止.
¹数组中的唯一性是不够的
²数组中的每个项目必须在整个集合中是唯一的
UPDATE1:
更多例子.受影响的架构条目如下所示:
var Account = new Schema({
...
uniquestrings: [{type: String, index: {unique: true}}]
...
});
Run Code Online (Sandbox Code Playgroud)
现在创建4个帐户文档.我想只有1和2可以,休息应该失败.
var accountModel1 = new Account.Model({uniquestrings: ["a", "b"]});
accountModel1.save(); // OK
var accountModel2 = new Account.Model({uniquestrings: ["c", "d"]});
accountModel2.save(); // OK
var accountModel3 = new Account.Model({uniquestrings: ["c", "d"]});
accountModel3.save(); // FAIL => Not unique, so far …Run Code Online (Sandbox Code Playgroud) 我正在尝试为文档中的数组字段创建唯一索引。该索引应该像当我有一个包含包含两个元素的数组的文档时一样工作,然后如果我想添加一个新文档,其中数组字段如果包含这两个元素,那么应该会发生重复错误 - 但在只有一个元素是的情况下不会在另一个数组中重复。也许我会用这个例子来说明我的意思:
首先我创建一个简单的文档:
{
"name" : "Just a name",
"users" : [
"user1",
"user2"
]
}
Run Code Online (Sandbox Code Playgroud)
我想在“用户”数组字段上创建唯一索引。我想要的结果是可以创建另一个这样的文档:
{
"name" : "Just a name",
"users" : [
"user1",
"user3"
]
}
Run Code Online (Sandbox Code Playgroud)
或者
{
"name" : "Just a name",
"users" : [
"user2",
"user5"
]
}
Run Code Online (Sandbox Code Playgroud)
但应该不可能创建第二个:
{
"name" : "Just a name",
"users" : [
"user1",
"user2"
]
}
Run Code Online (Sandbox Code Playgroud)
或者反过来:
{
"name" : "Just a name",
"users" : [
"user2",
"user1"
]
}
Run Code Online (Sandbox Code Playgroud)
但这是不可能的,因为 Mongo 给我一个错误,“users1”是重复的。是否可以在所有数组元素上创建唯一索引,如上所示?