【问题标题】:mongodb ignoring sparse on array indexmongodb忽略数组索引上的稀疏
【发布时间】:2021-04-15 08:35:18
【问题描述】:

在 mongo 4.4.3 中,我正在为数组创建一个唯一且稀疏的索引:

db.test.createIndex( { "array": 1 }, { unique: true, sparse: true } )

我用一些测试数据填充它:

db.test.insert({})
db.test.insert({array:[]})
db.test.insert({array:[ "a" ]})
db.test.insert({array:[ "b" ]})
db.test.insert({array:[ "c", "d" ]})

现在我会期待以下内容:

db.test.insert({array:[ "a" ]}) #FAIL
db.test.insert({array:[ "b" ]}) #FAIL
db.test.insert({array:[ "c" ]}) #FAIL
db.test.insert({array:[ "d" ]}) #FAIL
db.test.insert({})              #SUCCESS
db.test.insert({array:[]})      #SUCCESS

相反,我得到:

db.test.insert({array:[ "a" ]}) #FAIL
db.test.insert({array:[ "b" ]}) #FAIL
db.test.insert({array:[ "c" ]}) #FAIL
db.test.insert({array:[ "d" ]}) #FAIL
db.test.insert({})              #SUCCESS
db.test.insert({array:[]})      #FAIL

问题是:

"E11000 duplicate key error collection: db.test index: array_1 dup key: { array: undefined }"

空数组似乎被视为undefined - 但为什么 sparse 会被忽略?

有没有办法获得我预期的行为(不影响性能)?

【问题讨论】:

    标签: arrays mongodb indexing


    【解决方案1】:

    使用https://docs.mongodb.com/manual/core/index-partial/

    部分索引仅索引集合中满足指定过滤器表达式的文档。通过对集合中的文档子集进行索引,部分索引具有较低的存储要求并降低了索引创建和维护的性能成本。

    选项 1

    db.test.createIndex(
        { "array": 1 },
        { unique: true, partialFilterExpression: { "array": { $gt: [] } } }
    )
    

    仅当数组为 gt [] 时使用 partialFilterExpression: { "array": { $gt: [] } } 创建索引


    选项 2

    db.test.createIndex(
        { "array": 1 },
        { unique: true, partialFilterExpression: { "array.0": { $exists: true } } }
    )
    

    "array.0": { $exists: true } 将检查数组索引 0 是否可用,即数组有一些值。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2013-06-12
    • 2012-07-07
    • 2018-06-12
    • 1970-01-01
    • 2016-04-17
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多