Mongodb复合索引可确保嵌入文档中的唯一性

时间:2014-02-01 21:10:31

标签: mongodb indexing unique

我有一份文件,如下所示:

{
    "_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设置唯一索引以实现我想要的目标?

顺便说一句,我经常在设置特定权限的位置检索文档,所以无论如何我都需要一个权限数组的索引。 据我所知,这也很重要,我将在未来为权限数组添加更多不同的值类型。因此,“组”键可能不是将来唯一的键。

1 个答案:

答案 0 :(得分:0)

目前,索引(无论是否唯一)可以处理整个集合,而不是每个子文档。

如果你想在子文档上有某种独特性,你可以使用查询魔法:

db.c.update({
    name: 'Sammaye',
    'permission.group': {$ne: ObjectId()}
}, {$push:{permission:{group: ObjectId(), u: 31}}});

这当然只会在sammaye尚未具有该特定group条目时更新。随意修改它。