【问题标题】:Mongo aggregate $sum behaviorMongo 聚合 $sum 行为
【发布时间】:2016-11-08 04:54:04
【问题描述】:

我在 Motor 中有这个查询(看起来几乎与 CLI 查询完全一样):

response = yield self.db.orders.aggregate([
        {'$match': {'reader.uid': reader.get('uid'), 'status': {'$in': statuses}}},
        {'$sort': {'create_datetime': -1}},
        {'$project': {'_id': 1, 'status': 1, 'create_datetime': 1, 'documents': 1}},
        {'$group': {
            '_id': 0,
            'info': {'$push': {'status': '$status', 'create_datetime': '$create_datetime', 'documents': '$documents'}},
            'total': {'$sum': 1}
        }},
        {'$skip': skip},
        {'$limit': int(limit)}
    ])

需要获取$skip$limit 之前的文档总数。不确定,$sum 究竟是如何工作的,但是在这个查询中,我得到了正确的结果,但是当我通过实际的_id 时,total 的值为 1:

        {'$group': {
            '_id': '$_id',
            'info': {'$push': {'status': '$status', 'create_datetime': '$create_datetime', 'documents': '$documents'}},
            'total': {'$sum': 1}
        }},

我想在结果中得到真正的_id 和正确的total 值。

Mongo 新手,感谢所有答案。

【问题讨论】:

  • 不知道为什么当你按_id分组时得到sum=0,你确定没有错误?你的 _id 是什么类型的?
  • 是的,我得到 1,我的错!

标签: python mongodb aggregation-framework tornado-motor


【解决方案1】:

$group 将所有文档基于某个_id 组合/聚合在一起。

当您按_id=0 对文档进行分组时,所有文档都将位于同一组中,因为所有文档都具有相同的_id,即0$sum 将按指定值计算同一组中的所有文档:1

当您按原始_id 分组并且_id 在您的集合中是唯一的时,您应该得到sum=1,因为只有一个文档与_id => 一个组中的一个文档。

【讨论】:

  • 这是否意味着,我可以按任何相同的字段进行分组,比如reader.uid?这样,我得到了需要的结果,并将原来的_id推送到info
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2021-12-21
  • 2018-07-15
  • 2017-08-24
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多