0

快速提问,你知道 mongo 是否可以在以下数据上创建索引:

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

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

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

有任何想法吗?

干杯

4

2 回答 2

0

当您ensureIndex({prices:1})处理该数据时,您将在 price1、price2 和 price3 的精确组合上创建一个索引。因此,只有当您同时搜索所有三个价格的完全匹配时(搜索或潜在结果中没有额外的价格),该索引才可搜索。

但是,当您像这样构建数据时,您可以搜索单个价格:

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

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

另请参阅mongodb 中的索引文档

于 2012-11-16T10:26:50.850 回答
0

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

这不适用于子文档,因为您不能像这样进行位置排序:

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

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

因此,我建议您将字段投影到根文档。您可以使用@Philipp 的答案在这里对聚合框架做一些花哨的事情,但听起来这个查询可能会非常频繁地运行,并且可能在更大的工作集上运行。

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

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

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

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

于 2012-11-16T10:43:31.437 回答