Mongodb复合索引确保嵌入文档的唯一性
我有一个文件,看起来像这样:Mongodb复合索引确保嵌入文档的唯一性,mongodb,indexing,unique,Mongodb,Indexing,Unique,我有一个文件,看起来像这样: { "_id" : ObjectId("52ed4a833004dcaf9e224459"), "name": "unique name", "permission" : [ { "group" : ObjectId("52ed4a973004dcaf9e22445a"), "u" : 31 } ] } 我希望确保“permission”数组只能包含一个
{
"_id" : ObjectId("52ed4a833004dcaf9e224459"),
"name": "unique name",
"permission" : [
{
"group" : ObjectId("52ed4a973004dcaf9e22445a"),
"u" : 31
}
]
}
我希望确保“permission”数组只能包含一个带有键“group”和特定值的条目。但是,可能有多个条目具有相同的键和不同的值。
我尝试在唯一字段和“permission.group”上设置复合索引,但仍然能够插入重复文档:
db.user.ensureIndex({'name':1, 'permission.group':1}, {unique:1, sparse:1})
我还尝试在另一个唯一索引和permission.group上设置复合索引,如其他问题中所建议的那样
db.user.ensureIndex({name: 1}, {unique: 1, name: 'name_1'})
db.user.ensureIndex({'name_1':1, 'permission.group':1}, {unique:1, sparse:1})
但这会导致一个错误:
"err" : "E11000 duplicate key error index:People.user.$name_1_1_permission.group_1 dup key: { : null, : ObjectId('52ed4a973004dcaf9e22445a') }",
但是,数据库中当前没有设置了重复权限的用户。如果我将dropDups设置为true,则会删除除一个用户之外的所有用户,其中一个用户包含对相关组的权限。所以,这不是我想要的。
是否可以使用mongodb设置一个唯一的索引来实现我想要的
顺便说一句,我经常在设置了特定权限的地方检索文档,所以无论如何我都需要权限数组上的索引。
我知道这可能也很重要,我将来还会为权限数组添加更多不同的值类型。因此,“group”键可能不是将来唯一的索引。当前索引,无论是否唯一,都会处理整个集合,而不是每个子文档 如果希望子文档具有某种唯一性,可以使用查询魔术:
db.c.update({
name: 'Sammaye',
'permission.group': {$ne: ObjectId()}
}, {$push:{permission:{group: ObjectId(), u: 31}}});
当然,只有当sammaye
没有特定的组
条目时,才会更新。您可以根据需要随意修改它