MongoDB文档说多键索引不能覆盖对数组字段的查询

时间:2018-07-28 19:40:05

标签: mongodb indexing multikey

前提

MongoDB docs状态表明多键索引不能覆盖对数组字段的查询。

然后继续显示执行此操作的多键索引的example

问题

那怎么了? 多键索引的含义是什么,不能覆盖对数组字段的查询。也许我对 cover 的定义是错误的,但是我已经阅读了文档并了解了它们如何定义 cover

它们在文档中显示的示例代码

考虑以下形式的文件的库存收集:

 {
      _id: 1,
      item: "abc",
      stock: [
        { size: "S", color: "red", quantity: 25 },
        { size: "S", color: "blue", quantity: 10 },
        { size: "M", color: "blue", quantity: 50 }
      ]
    }
    {
      _id: 2,
      item: "def",
      stock: [
        { size: "S", color: "blue", quantity: 20 },
        { size: "M", color: "blue", quantity: 5 },
        { size: "M", color: "black", quantity: 10 },
        { size: "L", color: "red", quantity: 2 }
      ]
    }
    {
      _id: 3,
      item: "ijk",
      stock: [
        { size: "M", color: "blue", quantity: 15 },
        { size: "L", color: "blue", quantity: 100 },
        { size: "L", color: "red", quantity: 25 }
      ]
    }

以下操作在stock.sizestock.quantity字段上创建多键索引:

db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )

复合多键索引可以支持包含既包含索引字段又包含仅包含索引前缀“ stock.size”的谓词的查询,如以下示例所示:

db.inventory.find( { "stock.size": "M" } )
db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } )

1 个答案:

答案 0 :(得分:0)

假设您拥有属性“ stock”,它是对象数组,并且您在整个属性上创建了多键索引: .createIndex({“ stock”: 1})

案例1。索引{“ stock”:1}-如果您要搜索整体< / strong>对象

.find({“股票”:{“大小”:“ x”,“颜色”:“ y”,数量:1}})

情况2。索引{“ stock”:1}-如果仅搜索对象的一个​​属性,则无法使用

.find({“ stock.size”:“ x”})

BTW:如果在保存数组的属性上创建索引,则mongo会自动在该属性上创建多键索引。因此,“ stock”索引和“ stock.color”索引都是多键索引。这为在不同情况下使用相同的单词提供了一些混乱的空间。这就是为什么你感到困惑。