MongoDB多索引

时间:2012-11-16 10:22:37

标签: mongodb indexing

快速问题,您知道mongo是否可以为以下数据创建索引:

{
    prices: {
        price1: 0.90,
        price2: 0.12,
        price3: 0.13
    }
}

所以我想像这样ensureIndex({prices:1})做索引,但我不确定它是否包含所有价格及其价值。

我需要以这种方式放置数据而非标准阵列方法的原因是因为我希望能够根据选择的价格版本进行排序,即sort({prices.price:1})

有什么想法吗?

欢呼声

2 个答案:

答案 0 :(得分:0)

当您对该数据执行ensureIndex({prices:1})时,您将在price1,price2和price3的确切组合上创建索引。因此,只有在您搜索所有三种价格的完全匹配时才能搜索索引(搜索或潜在结果中没有其他价格)。

但是,您可以在构建数据时搜索单个价格:

{
    prices: [
         {version: 1, value: 0.99},
         {version: 2, value: 0.12},
         {version: 3, value: 0.13}
    ]
}

然后,您可以添加一个复合索引,其中包括price.version,prices.value和父文档中的唯一标识符。这样,您可以按{prices.version:1}{prices.version:2}快速搜索产品。

另见the documentation of indices in mongodb

答案 1 :(得分:0)

好的,我想我现在明白了。您希望按给定的价格版本对集合中的所有文档进行排序。

这对于子文档不会很好,因为你不能这样做位置排序:

find({price.version:1}).sort({price.$.version: 1})

因此,这将更好地作为根文档中的平面结构。事实上,在你的例子中,将它放在一个子文档中除了对实际使索引更难的数据进行分组之外没有其他用途。

所以我建议您只将字段投影到根文档。您可以使用@ Philipp的答案在聚合框架中做一些奇特的事情,但听起来这个查询可能会经常运行,也可能在较大的工作集上运行。

因此,新的文件结构将是:

{
        price1: 0.90,
        price2: 0.12,
        price3: 0.13
}

这就是我在SQL和MongoDB中做这种事情的方法,它适用于所有字段的复合索引。

由于MongoDB当然是无模式的,因此当您想要为应用添加新价格时,您不必担心维护数据库。