【问题标题】:MongoDB unique index for all array elements所有数组元素的 MongoDB 唯一索引
【发布时间】:2019-06-26 01:35:23
【问题描述】:

我正在尝试为文档中的数组字段创建唯一索引。这个索引应该像我有一个包含两个元素的数组的文档一样工作,然后如果我想添加一个新文档,其中数组字段如果包含这两个元素,那么应该发生重复错误 - 但不是在只有一个元素是的情况下在另一个数组中复制。 也许我会用这个例子来说明我的意思:

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

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

【问题讨论】:

标签: arrays mongodb collections mongodb-query


【解决方案1】:

根据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 已经存在第一个文档的用户索引。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2014-06-09
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多