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

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

作者: butters001 | 来源:发表于2021-12-29 15:16 被阅读0次

    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字段排序,再根据排序结果进行分组取每组最后一条数据。
    注意:分组后,每组内的数据,会保持之前的顺序排列。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/mlbvqrtx.html