聚合 按字段A分组,然后取每组内的最后一条数据的某一个字段的值

2021-12-29  本文已影响0人  butters001

demo 数据

{
    {'_id': ObjectId('61cbd33850ada9fbdc600812'),
     'pid': 1,
     'other': 2,
     'uid': 888},
    {'_id': ObjectId('61cbd36750ada9fbdc600824'),
     'pid': 1,
     'other': 3,
     'uid': 998},
    {'_id': ObjectId('61cbd37550ada9fbdc600832'),
     'pid': 2,
     'other': 7,
     'uid': 22},
    {'_id': ObjectId('61cbd38750ada9fbdc600837'),
     'pid': 3,
     'other': 5,
     'uid': 87},
    {'_id': ObjectId('61cbd39050ada9fbdc60083a'),
     'pid': 3,
     'other': 7,
     'uid': 12},
    {'_id': ObjectId('61cbd46a50ada9fbdc60086a'),
     'pid': 3,
     'other': 22222,
     'uid': 35}
}

查询

查询1

a=client.mytest.test1.aggregate(
    [
        {
            "$group":{
                "_id":"$pid",
                "other":{
                    "$last":"$other"
                },
                "uid":{
                    "$last":"$uid"
                }
            }
        },
        {
            "$sort":{
                "other":1
            }
        }
    ]
)

结果

[
    {'_id': 1, 'other': 3, 'uid': 998},
    {'_id': 2, 'other': 7, 'uid': 22},
    {'_id': 3, 'other': 22222, 'uid': 35}
]

查询2

a=client.mytest.test1.aggregate(
    [
        {
            "$group":{
                "_id":"$pid",
                "other":{
                    "$last":"$other"
                }
        },
        {
            "$sort":{
                "other":1
            }
        }
    ]
)

结果

[{'_id': 1, 'other': 3}, {'_id': 2, 'other': 7}, {'_id': 3, 'other': 22222}]

查询3
先按 other 倒序排列,再按 pid 分组取每组的最后一个 other

a=client.mytest.test1.aggregate(
    [
        {
            "$sort":{
                "other":-1
            }
        },
        {
            "$group":{
                "_id":"$pid",
                "other":{
                    "$last":"$other"
                }
        }
    ]
)

结果

[{'_id': 1, 'other': 2}, {'_id': 2, 'other': 7}, {'_id': 3, 'other': 5}]

分析
先倒序

[{'_id': ObjectId('61cbd46a50ada9fbdc60086a'),
  'pid': 3,
  'other': 22222,
  'uid': 35},
 {'_id': ObjectId('61cbd37550ada9fbdc600832'),
  'pid': 2,
  'other': 7,
  'uid': 22},
 {'_id': ObjectId('61cbd39050ada9fbdc60083a'),
  'pid': 3,
  'other': 7,
  'uid': 12},
 {'_id': ObjectId('61cbd38750ada9fbdc600837'),
  'pid': 3,
  'other': 5,
  'uid': 87},
 {'_id': ObjectId('61cbd36750ada9fbdc600824'),
  'pid': 1,
  'other': 3,
  'uid': 998},
 {'_id': ObjectId('61cbd33850ada9fbdc600812'),
  'pid': 1,
  'other': 2,
  'uid': 888}]

再分组,取每组最后一个

util

查询 1和 2,是先按pid分组,再查每组最后一条,得出结果A,最后在对A里的other字段进行排序
查询3,是先按other字段排序,再根据排序结果进行分组取每组最后一条数据。
注意:分组后,每组内的数据,会保持之前的顺序排列。

上一篇下一篇

猜你喜欢

热点阅读