所有数组元素的MongoDB唯一索引

时间:2019-02-01 13:01:25

标签: arrays mongodb collections mongodb-query

我正在尝试为文档中的数组字段创建唯一索引。该索引的工作方式类似于当我有一个包含两个元素的数组的文档时,然后,如果我想添加一个新文档,如果数组字段包含这两个元素,则应该发生重复错误-但在仅包含一个元素的情况下不会出现这种情况复制到另一个数组中。 也许我将向示例展示我的意思:

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

{
    "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”已重复。 如上所示,是否可以在所有数组元素上创建唯一索引?

2 个答案:

答案 0 :(得分:0)

按照Mongo official documentation

  

对于唯一索引,唯一约束适用于跨集合中的各个文档而不是单个文档中

     

因为唯一约束适用于单独的文档,所以对于唯一的多键索引,文档可能具有导致重复索引键值的数组元素,只要该文档的索引键值不与另一个文档的索引键值重复文档。

因此您不能将第二个文档插入为

{
"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已经存在,因此第一个文档的用户索引已存在。

当前,您只有一种解决方案,可以从插入集合的位置通过代码进行管理。在保存或更新之前,请进行验证逻辑,并确保要施加的约束。

答案 1 :(得分:0)

我有一个非常相似的问题,可悲的是似乎不可能。不是因为唯一约束仅适用于单独的文档,而是因为:

  

要为包含数组值的字段建立索引,MongoDB将为数组中的每个元素创建一个索引键

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