Mongo汇总$ sum行为

时间:2016-07-06 07:56:23

标签: python mongodb aggregation-framework tornado-motor

我在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的新手总数,所有答案都很受欢迎。

1 个答案:

答案 0 :(得分:1)

$group分组/根据某个_id汇总所有文档。

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

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