我是MongoDB的相对新手,但是从我读过的内容中可以找到各种方法来查找MongoDB数据库中的平均值和值的总和,每种方法都有各种优点和缺点.
我主要要求一种方法,以尽可能高效(快速)的方法找到值的选择总和,以及选择值的平均值.
正在查询的集合中的文档类似于此结构(具有许多其他字段):
{
"_id": ObjectId('4e650107580fd649e5000005'),
"date_added": ISODate("2011-09-05T00:00:00Z"),
"value": 1500
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,并非总是可以预先计算总和,因为要求求和的值的选择可以改变(基于日期范围 - 例如在开始日期和结束日期之间,平均值是多少).这是预先计算平均值的类似问题.
根据我的阅读,MapReduce绝对不适合实时(即按需)查找,所以这似乎也是不可能的.
目前我正在以这种方式查询集合:(注意:这是使用pymongo)
response = request.db['somecollection'].find(
{
'date_added': {
'$gte': date_start,
'$lte': date_end
}
},
{
'value':1
}
).limit(500)
Run Code Online (Sandbox Code Playgroud)
然后使用for循环响应在Python中进行计算.500结果的限制是任意的,以防止它变得太慢.我只检索值,而没有其他字段.
这是进行这种计算的最有效方法,还是有其他方法可以实现我的需要?
注意事项:
group功能,因为我将来可能会使用分片编辑:
我应该指出,从我上面发布的查询返回的文档数量可以是从1个文档到数百个,但最多可能有大约150个返回文档(平均大约60或70)
尝试一下map-reduce,它可能没有你想象的那么慢。我已经用它对一些大型数据集进行实时聚合,虽然有时速度不是快如闪电,但更多时候还是不错的。最好可以过滤要聚合的初始数据的大小,例如:
db.collection.mapReduce(m, r, { query : { year: 2011 } });
Run Code Online (Sandbox Code Playgroud)
如果您需要进一步加快速度,请考虑将数据分布在分片集群上。然后,map-reduce 处理可以扩展到并行运行的多个分片上。
| 归档时间: |
|
| 查看次数: |
4923 次 |
| 最近记录: |