我首先尝试按日期排序数据,然后在另一个字段上进行分组。 这对我不起作用。
我想回答的问题是:选择最新的不同cid?
给出这些数据:
db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] })
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] })
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] })
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] })
db.summary.aggregate( {$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}} )
我先在圈子里做比赛, 那么约会, 然后是一个关于cid的小组
我得到的结果:
{
"result" : [
{
"_id" : 3
},
{
"_id" : 1
},
{
"_id" : 2
}
],
"ok" : 1
}
以下是我的分析:
在按日期匹配或排序之前,数据为:
"lid" : 5, "date" : 5, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 1, "date" : 1, "cid" : 1
按日期排序后,数据集将为:
"lid" : 5, "date" : 5, "cid" : 2
"lid" : 3, "date" : 3, "cid" : 2
"lid" : 2, "date" : 2, "cid" : 1
"lid" : 1, "date" : 1, "cid" : 1
"lid" : 4, "date" : 0, "cid" : 3
所以在分组之后,我期望的结果是:
{
"result" : [
{
"_id" : 2
},
{
"_id" : 1
},
{
"_id" : 3
}
],
"ok" : 1
}
什么查询可以解决我的问题?
为什么当前查询对我不起作用?
答案 0 :(得分:20)
当您在管道$group
之后$sort
时,之前的排序会丢失。您必须执行此类操作,以便在分组后可以使用您要排序的日期:
db.summary.aggregate(
{$match: {circles: 2}},
{$group: {_id: '$cid', date: {$max: '$date'}}},
{$sort: {date: -1}});
结果:
[ { _id: 2, date: 5 },
{ _id: 1, date: 2 },
{ _id: 3, date: 0 } ]
如果要重新整形输出,请在管道末尾添加$project
。