【发布时间】: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 的文档时,由于违反唯一索引而导致操作失败,而我希望空值位于唯一索引之外。