MongoDB:通过索引加速聚合或找到不同的解决方案?

时间:2012-08-22 08:58:50

标签: mongodb

好的,MongoDB专家,请看看我的收藏:

[{
  "_id" : "item_0",
  "Name" : "Item 0",
  "Description" : "Some description for this item...",
  "Properties" : {
    "a" : 5.0,
    "b" : 0.0,
    "c" : 6.0,
    "d" : 6.0,
    "e" : 2.0,
    "f" : 0.0,
    "g" : 9.0,
    "h" : 3.0,
    "i" : 4.0,
    "j" : 5.0
  }
},
{ // 5.000-10.000 more items... }
]

我使用这个聚合来乘以一组选定的属性(在本例中为a,b,c和d),然后按产品对它们进行排序:

{
    "aggregate": "item",
    "pipeline": [
        {
            "$project": {
                "_id": 1,
                "Name": 1,
                "s": {
                    "$multiply": [
                        "$Properties.a",
                        "$Properties.b",
                        "$Properties.c",
                        "$Properties.d"
                    ]
                }
            }
        },
        {
            "$sort": {
                "s": -1
            }
        },
        {
            "$limit": 100
        }
    ]
}

现在这个工作正常,但是当项目和属性的数量增加时,执行聚合的时间会增加很多!

有没有更好的方法(更高效)来实现这样的目标?最高产品的搜索(一组属性的多个)必须是活泼的。如果有一种方法可以对此进行索引,使用所有不同的属性组合并将它们缓存或者其他什么?只要查询速度很快,索引就需要一段时间了!

感谢您对此事的任何帮助,我非常感激!

1 个答案:

答案 0 :(得分:4)

鉴于您需要更快的搜索和效率,我认为更好的方法是将Map / Reduce与输出集合一起使用(至少在Aggregation Framework支持使用集合进行输出之前)。

在您的用例中使用输出集合有几个优点。

特别是:

  • 您可以灵活地建立索引和排序
  • 不必为每个查询实时计算结果
  • 您不受内联结果的16Mb BSON文档大小的限制

您可以使用merge output option进行Map / Reduce更新输出集合中的计算(实际上,这将是您的缓存)。

根据您的各种属性更新的频率,我将根据“上次更新”时间戳或其他一些标准调查增量方法,以便您确定何时需要重新计算值。这样,您可以随着集合的增长,使批量大小更易于管理。