【问题标题】:MongoDB multi indexingMongoDB多索引
【发布时间】:2012-11-16 10:22:37
【问题描述】:

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

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

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

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

有什么想法吗?

干杯

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

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

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

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

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

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

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

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

    这就是我在 SQL 和 MongoDB 中执行此类操作的方式,并且它适用于所有字段的复合索引。

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

    【讨论】:

    • 这很好,尽管在其上创建索引并不容易,因为我无法确切知道会有多少价格版本,因此可能最初的想法是在价格下进行分组,这也行不通。
    • @Marcin Yea 索引创建是一个问题,我想这在任何数据库中都会是一个问题。嗯,我会继续思考
    • 谢谢 Sammaye,是的,这肯定是一件很棘手的事情,除非你不想跨几个表扩展
    【解决方案2】:

    当您对该数据执行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} 快速搜索产品。

    另见the documentation of indices in mongodb

    【讨论】:

    • 那么我将如何根据特定版本的定价对所有内容进行排序? sort({prices.value:1}) 将按任何价格对其进行排序,而不仅仅是版本相关
    • sort({prices.version:1}) 会做到的。
    • 不是真的,那只是根据价格版本而不是它的价值来排序
    • 也许您可以举例说明“全部”的含义以及您期望结果的外观,也许可以用它来编辑您的问题?
    • Sammaye 上面的例子,想象一下有人选择了price2,那么如何按其值排序呢?
    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2015-08-08
    • 2012-09-19
    • 1970-01-01
    相关资源
    最近更新 更多