【问题标题】:MongoDB unique partial index for an array of sub-documents子文档数组的 MongoDB 唯一部分索引
【发布时间】:2021-06-22 17:22:01
【问题描述】:

我有以下形式的文档集合:

{
    "_id" : UUID("e8d8f0a0-d8e4-4234-b017-251e90ad5202"),
    "legalEntities" : [
        {
            "id" : UUID("5aa70699-e6c3-4aac-a860-0c0d44ea4ab3"),
            "dunsNumber" : "123456789"
        },
        {
            "id" : UUID("e8d8f0a0-d8e4-4234-b017-251e90ad5202"),
            "dunsNumber" : null
        }
    ],
    "name" : "Company X"
}

我希望legalEntities.dunsNumber 在所有文档中都是唯一的空值除外

如何在 MongoDB 中实现这一点?

(尝试在legalEntities.dunsNumber 上使用部分索引,但这种方法似乎不起作用)。

【问题讨论】:

  • 看到这个question和接受的答案,你可以使用类似的方法和部分索引,提供部分过滤器$type: "string"
  • @turivishal 我做同样的事情,但不幸的是它不适用于子文档数组。我当前的索引定义是:{ "v" : 2, "unique" : true, "key" : { "legalEntities.dunsNumber" : 1 }, "name" : "legalEntities.dunsNumber", "ns" : "profiles-test.legalEntities", "partialFilterExpression" : { "legalEntities.dunsNumber" : { "$type" : [ "string" ] } } }
  • 索引看起来不错,请确保您已阅读 answer 中提供的注释,要使用部分索引,查询必须包含过滤器表达式,例如 { "legalEntities.dunsNumber": { $eq: "123456789", $type: "string" } }
  • 你能解释一下什么不起作用吗? 1)它允许插入重复值还是不抛出重复值错误? 2) 查找/聚合/更新查询时没有使用索引? 3)还有什么?
  • @turivishal 当我插入另一个带有legalEntities.dunsNumber = null 的文档时,由于违反唯一索引而导致操作失败,而我希望空值位于唯一索引之外。

标签: mongodb indexing


【解决方案1】:

部分索引过滤器存在限制,如SERVER-17853 和 A discussion 中所述用于 MongoDB 开发者论坛中的相同场景。

对于您的用例,它需要 $elemMatch$ne 运算符,但尚不支持。

我的建议是在解决 SERVER-17853 之前暂时不要使用数组或索引。

【讨论】:

  • 是的,看起来我别无选择,只能使用稀疏索引并且根本不存储空值。在我的情况下这是可能的,但需要额外的努力,因为我正在从强类型 DTO 映射对象。
  • 是的,你是对的,我只是解决方法,唯一的选择是稀疏索引,如果你不在文档中包含 null 属性。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2017-01-11
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2014-11-12
相关资源
最近更新 更多