【问题标题】:Trying to create composite unique index with partialFilterExpression尝试使用 partialFilterExpression 创建复合唯一索引
【发布时间】: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,但没有存在 bc。在这种情况下,当我尝试创建稀疏索引时,它会因重复索引{a: something, b: null, c: null} 而失败。这就是我选择该特定功能的原因,因为只有当这三个功能都存在时我才需要验证。

标签: mongodb indexing database


【解决方案1】:

刚刚弄清楚我的问题是什么。我的mongo版本是3.0.12,partialFilterExpression是3.2版本引入的

【讨论】:

  • 我正在使用 mongodb 版本 3.0.12 如何实现 partialFilterExpression 的行为。有什么解决办法吗?
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2017-02-19
  • 2013-05-15
  • 2012-03-24
  • 2016-04-17
相关资源
最近更新 更多