MongoDB全数组元素的唯一索引

5
我想创建一个文档中数组字段的唯一索引。这个索引应该像这样工作:当我有一个包含两个元素的数组的文档时,如果我想要添加一个新的文档,其中数组字段包含这两个元素,则会发生重复错误 - 但是不会在另一个数组中重复一个元素的情况下发生。 也许我可以展示一下我的意思:

首先我创建一个简单的文档:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user2"
    ]
}

我希望在“用户”数组字段上创建唯一索引。我想要的结果是能够创建另一个类似于以下文档的文档:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user3"
    ]
}

或者

{
    "name" : "Just a name",
    "users" : [ 
        "user2", 
        "user5"
    ]
}

但是创建第二个应该是不可能的:

{
    "name" : "Just a name",
    "users" : [ 
        "user1", 
        "user2"
    ]
}

或者反过来:

{
    "name" : "Just a name",
    "users" : [ 
        "user2", 
        "user1"
    ]
}

但是这是不可能的,因为Mongo会给我一个错误提示,指出"users1"是重复的。 是否可以在上述所有数组元素上创建唯一索引?


https://docs.mongodb.com/manual/core/index-multikey/ - MrElephant
这个问题的有益答案:https://dev59.com/Jmw15IYBdhLWcg3wO5SX - Adarsh Madrecha
2个回答

4
根据Mongo官方文档,对于唯一索引,唯一约束条件适用于集合中的单独文档,而不是单个文档内部。由于唯一约束条件适用于单独文档,因此对于唯一多键索引,一个文档可能具有导致重复索引键值的数组元素,只要该文档的索引键值不重复于另一个文档的索引键值即可。因此,您无法像以下方式插入第二个文档:
{
"name" : "Just a name",
"users" : [ 
    "user1", 
    "user3"
]
}

你会收到唯一约束的重复错误提示:
> db.st1.insert({"name":"Just a name","users":["user1","user3"]})
WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "E11000 duplicate key error collection: test.st1 index: users_1 dup key: { : \"user1\" }"
   }
})

由于用户user1已经存在,因此在第一个文档的用户索引中。

目前您唯一的解决方案是通过插入到集合的代码来管理它。在保存或更新之前,请进行验证逻辑并确保您想要施加的约束。


0

我有一个非常相似的问题,但不幸的是似乎无法解决。这并不是因为唯一约束仅适用于单独的文档,而是因为:

要对包含数组值的字段进行索引,MongoDB会为数组中的每个元素创建一个索引键

即所有单独的数组元素必须在所有其他文档中都是唯一的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接