【发布时间】:2011-11-11 04:44:01
【问题描述】:
我是 MongoDB 的相对新手,但根据我所阅读的内容,有多种方法可以在 MongoDB 数据库中查找平均值和值的总和,每种方法都有不同的优点和缺点。
我主要是在寻求一种方法,以尽可能高效(快速)的方法找到一组值的总和,以及一组值的平均值。
正在查询的集合中的文档类似于这种结构(具有许多其他字段):
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
在我的应用程序中,预先计算诸如总和之类的东西并不总是可行的,因为要求和的值的选择可能会发生变化(基于日期范围 - 例如,在开始日期和结束日期之间,平均值是多少)。这是与预先计算平均值类似的问题。
根据我的阅读,MapReduce 绝对不适合实时(即按需)查找,因此这似乎也不可能。
目前我正在以这种方式查询集合:(注意:这是使用pymongo)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
然后在 Python 中使用 for 循环在响应上进行计算。 500 个结果的限制是任意的,以防止它变得太慢。我只检索值,而不检索其他字段。
这是进行此计算的最有效方法,还是有其他方法可以完成我的需要?
注意事项:
- 我不能使用
group函数,因为我将来可能会使用分片 - 我不能使用 MapReduce,因为它是用户即时使用的功能
- 我无法预先计算很多总和/平均值,因为对总和/平均值的选择几乎总是不同的
- 我查看了 stackoverflow 和网络,试图找到关于如何做这种事情的建议,而且它是相当开放的
编辑:
我应该指出,从我上面发布的查询返回的文档数量可能从 1 个文档到数百个不等,但可能返回的文档的最大数量约为 150 个(平均约为 60 或 70 个)
【问题讨论】: