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