Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb复合索引确保嵌入文档的唯一性_Mongodb_Indexing_Unique - Fatal编程技术网

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
没有特定的
条目时,才会更新。您可以根据需要随意修改它