好的,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
}
]
}
现在这个工作正常,但是当项目和属性的数量增加时,执行聚合的时间会增加很多!
有没有更好的方法(更高效)来实现这样的目标?最高产品的搜索(一组属性的多个)必须是活泼的。如果有一种方法可以对此进行索引,使用所有不同的属性组合并将它们缓存或者其他什么?只要查询速度很快,索引就需要一段时间了!
感谢您对此事的任何帮助,我非常感激!
答案 0 :(得分:4)
鉴于您需要更快的搜索和效率,我认为更好的方法是将Map / Reduce与输出集合一起使用(至少在Aggregation Framework支持使用集合进行输出之前)。
在您的用例中使用输出集合有几个优点。
特别是:
您可以使用merge
output option进行Map / Reduce更新输出集合中的计算(实际上,这将是您的缓存)。
根据您的各种属性更新的频率,我将根据“上次更新”时间戳或其他一些标准调查增量方法,以便您确定何时需要重新计算值。这样,您可以随着集合的增长,使批量大小更易于管理。