Mongodb 在聚合结果中对子数组进行排序
我有三份文件:Mongodb 在聚合结果中对子数组进行排序,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有三份文件: { "id_user": "t57092501745ad6285ac58c22", "name": "Day #1", "date": { "$date": "2016-04-21T20:50:00.190Z" }, "text": "My text" } { "id_user": "t57092501745ad6285ac58c22", "name": "Day #2", "date": {
{
"id_user": "t57092501745ad6285ac58c22",
"name": "Day #1",
"date": {
"$date": "2016-04-21T20:50:00.190Z"
},
"text": "My text"
}
{
"id_user": "t57092501745ad6285ac58c22",
"name": "Day #2",
"date": {
"$date": "2016-04-22T20:50:00.190Z"
},
"text": "My text"
}
{
"id_user": "t57092501745ad6285ac58c22",
"name": "Day #3",
"date": {
"$date": "2016-04-22T20:51:00.190Z"
},
"text": "My text"
}
我需要每天对这些进行分组,所以我会:
{
"$match": {
"id_user": "t57092501745ad6285ac58c22"
}
}, {
"$sort": {
"date": -1
}
}, {
"$group": {
"_id": {
$dayOfYear: "$date"
},
"data": {
"$push": {
"id_user": "$id_user",
"name": "$name",
"date": "$date",
"text": "$text"
},
},
}
}
结果是:
{
{
_id: 113,
data: [{
"id_user": "t57092501745ad6285ac58c22",
name: "Day #1",
date: "2016-04-22T20:51:00.190Z",
text: "My text"
}]
}, {
_id: 114,
data: [{
"id_user": "t57092501745ad6285ac58c22",
name: "Day #3",
date: "2016-04-23T20:51:00.190Z",
text: "My text"
}, {
"id_user": "t57092501745ad6285ac58c22",
name: "Day #2",
date: "2016-04-23T20:50:00.190Z",
text: "My text"
}]
}
}
没关系,但订单不是我需要的:
{ Day #1 }, { Day #3, Day #2 }
如果我将排序
更改为{“日期”:1}
我可以颠倒两组的顺序,方法如下:
{ Day #3, Day #2 }, { Day #1 }
但我不知道如何更改子数组中的顺序,以获得正确的:
{ Day #1 }, { Day #2, Day #3 }
正确的方法是什么?如果您希望“数组”中的项目按“升序”排列,那么您的
$sort
顺序是错误的,您需要将其反转。另外,$group
作为“文档”的输出不会以任何方式排序。因此,如果您想要一个特定的订单,那么您实际上还需要对返回的\u id
进行$sort
:
[
{“$match”:{
“id_用户”:“t57092501745ad6285ac58c22”
}},
{“$sort”:{“日期”:1}
{“$组”:{
“_id”:{“$dayOfYear”:“$date”},
“数据”:{
“$push”:{
“id_用户”:“$id_用户”,
“名称”:“$name”,
“日期”:“$date”,
“文本”:“$text”
}
}
}},
{“$sort”:{“\u id”:1}
]
然后这两个顺序都是正确的您按“降序”排序。改为“升序排序:
{“$Sort”:{“date”:1}}
不,正如我所说,这不起作用,请阅读我的问题。是的,它起作用,请思考一下。在添加到数组之前,$sort
,因此,$push
将遵循$sort
中的发现顺序,并且“数组元素”将以这种方式排序(更正了$sort
顺序。$group
没有。因此,如果您想要“文档”如果要按顺序发出,则需要另一个$sort
作为最后一个管道阶段(也是升序)。{“$sort”:{“\u id”:1}
。仔细看,第3天是“以后”日期大于第2天。因此您的顺序错误,并且没有注意到$group
没有按顺序发出。@BlakesSeven是的,谢谢,这是正确的答案!这对我来说不明显,谢谢。如果您将此作为答案,我将关闭此问题。再次感谢。