【发布时间】:2017-11-16 23:02:51
【问题描述】:
我正在尝试使用复合键为我的集合创建一个唯一索引,但某些文档的索引字段可能为 null。通过documentation 看来我应该能够使用 partialFilterExpression 来做到这一点。
我试过如下:
db.collection.createIndex(
{ a: 1, b: 1, c: 1 },
{
"background":true,
"unique": true,
"partialFilterExpression": {
"a": { "$exists": true },
"b": { "$exists": true },
"c": { "$exists": true }
}
})
但这给了我以下错误:
异常:E11000 重复键错误集合:schema.collection 索引:a_1_b_1_c_1 重复键:{:null,:null,:null}
我什至尝试将部分过滤条件更改为:
db.collection.createIndex(
{ a: 1, b: 1, c: 1 },
{
"background":true,
"unique": true,
"partialFilterExpression": {
"a": { "$exists": true, "$ne": null },
"b": { "$exists": true, "$ne": null },
"c": { "$exists": true, "$ne": null }
}
}
)
但仍然返回相同的错误。
是我理解错了还是用错了?
【问题讨论】:
-
此外,您正在尝试'重新发明轮子"。MongoDB 有一个 "sparse indexes" 选项,它可以满足您的需求
db.collection.createIndex({ a: 1, b: 1, c: 1 },{ "background": true, "unique": true, "sparse": true })。尽管如在您可以使用较新选项“做更多”的文档,默认行为适合这种特定情况。 -
其实不适合我的情况。我有一些文档中存在 a,但没有存在 b 或 c。在这种情况下,当我尝试创建稀疏索引时,它会因重复索引
{a: something, b: null, c: null}而失败。这就是我选择该特定功能的原因,因为只有当这三个功能都存在时我才需要验证。