我有一份文件,如下所示:
{
"_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上设置复合索引,如另一个关于SO的问题所推荐。
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,则会删除除one之外的所有用户,其中包含对相关组的权限。所以,这不符合我的意愿。 是否可以使用mongodb设置唯一索引以实现我想要的目标?
顺便说一句,我经常在设置特定权限的位置检索文档,所以无论如何我都需要一个权限数组的索引。 据我所知,这也很重要,我将在未来为权限数组添加更多不同的值类型。因此,“组”键可能不是将来唯一的键。
答案 0 :(得分:0)
目前,索引(无论是否唯一)可以处理整个集合,而不是每个子文档。
如果你想在子文档上有某种独特性,你可以使用查询魔法:
db.c.update({
name: 'Sammaye',
'permission.group': {$ne: ObjectId()}
}, {$push:{permission:{group: ObjectId(), u: 31}}});
这当然只会在sammaye
尚未具有该特定group
条目时更新。随意修改它。