MongoDB中的'AVG'和'SUM'功能,有什么提示吗?

joh*_*eth 7 mongodb nosql

我是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功能,因为我将来可能会使用分片
  • 我不能使用MapReduce,因为它是一个将由用户即时使用的功能
  • 我不能预先计算很多我的总和/平均数,因为总和/平均值的选择几乎总是不同的
  • 我已经浏览了stackoverflow和网络,试图找到关于如何做这种事情的建议,并且它是相当开放的

编辑:

我应该指出,从我上面发布的查询返回的文档数量可以是从1个文档到数百个,但最多可能有大约150个返回文档(平均大约60或70)

Chr*_*tow 4

尝试一下map-reduce,它可能没有你想象的那么慢。我已经用它对一些大型数据集进行实时聚合,虽然有时速度不是快如闪电,但更多时候还是不错的。最好可以过滤要聚合的初始数据的大小,例如:

db.collection.mapReduce(m, r, { query : { year: 2011 } });
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步加快速度,请考虑将数据分布在分片集群上。然后,map-reduce 处理可以扩展到并行运行的多个分片上。

  • 不要忘记您可以向 Map-Reduce 提供查询来限制输入。MR 仍然不如直接查询那么可扩展(Javascript 限制要求一次只能运行一个 Map-Reduce 或其他 Javascript 任务),但是使用将结果过滤到上面提到的大约 150 个的查询,它应该很漂亮快速地。 (2认同)
  • @Chris V8 不会改善 MongoDB 中 JavaScript 绑定功能的并发性或单线程性质。但它可能会提高性能。 (2认同)