【问题标题】:Indexing MongoDB array position queries索引 MongoDB 数组位置查询
【发布时间】:2018-08-14 13:09:08
【问题描述】:

我想建立一个支持查询特定数组元素位置的索引。

给定数百万个包含值数组的文档:

db.foo.insert({ array: [true, false, null, true] })
db.foo.insert({ array: [false, null, true, true] })

我想搜索位置 2 中带有 true 的文档。

db.foo.find({ "array.2": true })

如果我创建一个多键索引:

db.foo.createIndex({ array: 1 })

索引支持{ "array": true }(搜索所有数组元素)形式的查询,但不支持{ "array.2": true }(搜索特定数组元素)。

documentation 表示“MongoDB 为数组中的每个元素创建一个索引键”,所以我期待如果我在 array 字段上创建一个索引,它将用于array.0 上的查询, array.1array.2 等。有什么诀窍可以让它工作吗?

【问题讨论】:

    标签: arrays mongodb indexing multikey


    【解决方案1】:

    MongoDB 的多键索引只索引数组的值,而不索引该值在数组中的位置。

    话虽如此,有一种可能的解决方法可以满足您的要求。

    您需要存储一个显示元素位置的“键”,而不是只存储数组的值。使用您的示例:

    > db.test.find()
    {
      "_id": 0,
      "a": [
        {"k": 0, "v": true},
        {"k": 1, "v": false},
        {"k": 2, "v": null},
        {"k": 3, "v": true}
      ]
    }
    {
      "_id": 1,
      "a": [
        {"k": 0, "v": false},
        {"k": 1, "v": null},
        {"k": 2, "v": true},
        {"k": 3, "v": true}
      ]
    }
    

    请注意,在上面的示例中,我使用带有字段 k 的子文档来表示“数组位置”,并使用字段 v 来存储“数组元素”。

    然后您可以创建索引两个字段的索引:

    db.test.createIndex({'a.k':1, 'a.v':1})
    

    并且查询应该使用$elemMatch operator 来确保整个子文档匹配。假设您正在搜索 2 的 ktruev

    > db.test.find({a: {$elemMatch: {k:2, v:true}}})
    {
      "_id": 1,
      "a": [
        {"k": 0, "v": false},
        {"k": 1, "v": null},
        {"k": 2, "v": true},
        {"k": 3, "v": true}
      ]
    }
    

    这种方法的一个缺点是您需要自己处理k 字段。插入数组有点复杂,因为如果要将k 视为数组索引,则在执行$push 之前必须知道k 的最大值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2021-03-24
      • 1970-01-01
      • 2013-08-10
      • 2016-09-30
      • 2013-08-23
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多