mongo聚合字段x,最大y

时间:2015-07-24 16:52:17

标签: mongodb mongodb-query aggregation-framework

我有一系列文件,例如:

{_id: 1, kind: 'cow', nickname: 'bess', weight: 145}
{_id: 2, kind: 'cow', nickname: 'babs', weight: 130}
{_id: 3, kind: 'horse', nickname: 'boris', weight: 140}
{_id: 4, kind: 'horse', nickname: 'gnoris', weight: 110}

我想按“种类”字段对它们进行分组,然后返回每组中重量最大的动物的昵称,组中的最大重量以及组中的动物数量,从而返回:

{'kind': 'cow', 'nickname': 'bess', 'max_weight': 145, 'count': 2}
{'kind': 'horse', 'nickname': 'boris', 'max_weight': 140, 'count': 2}

我可以看到如何使用以下mongo聚合返回每个组的最大权重和计数:

db.aggregate([
    {'$group': {'_id': '$kind',
                'max_weight': {'$max': '$weight'},
                'count': {'$sum': 1}}}
])

有没有办法让这个聚合返回每个组中最重的动物的相应昵称?

1 个答案:

答案 0 :(得分:4)

使用$sort代替$max返回$first的整个文档和参考:

db.collection.aggregate([
    { "$sort": { "weight": -1 } },
    { "$group": {
         "_id": "$kind", 
         "max_weight": { "$first": "$weight" },
         "nickname": { "$first": "$nickname" },
         "count": { "$sum": 1 }
    }}
])

这确保了“分组边界”上的文档值由您提供给$first的参数返回。由于$sort是“重量”的降序。