Gio*_*rio 5 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": {
"$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"
}
Run Code Online (Sandbox Code Playgroud)
我需要将这些分组为一天,所以我这样做:
{
"$match": {
"id_user": "t57092501745ad6285ac58c22"
}
}, {
"$sort": {
"date": -1
}
}, {
"$group": {
"_id": {
$dayOfYear: "$date"
},
"data": {
"$push": {
"id_user": "$id_user",
"name": "$name",
"date": "$date",
"text": "$text"
},
},
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
{
{
_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"
}]
}
}
Run Code Online (Sandbox Code Playgroud)
没关系,但订单不是我需要的:
{ Day #1 }, { Day #3, Day #2 }
Run Code Online (Sandbox Code Playgroud)
如果我更改sort为{ "date": 1 }我可以反转2组的顺序,这样:
{ Day #3, Day #2 }, { Day #1 }
Run Code Online (Sandbox Code Playgroud)
但我不知道如何更改子数组内的顺序,以获得正确的:
{ Day #1 }, { Day #2, Day #3 }
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
如果你希望“数组”中的项目按“升序”排列,那么你的$sort顺序是错误的,你需要颠倒它。作为“文档”的输出也$group没有以任何方式排序。因此,如果您想要特定的订单,那么您实际上还需要$sort返回:_id
[
{ "$match": {
"id_user": "t57092501745ad6285ac58c22"
}},
{ "$sort": { "date": 1 } }
{ "$group": {
"_id": { "$dayOfYear": "$date" },
"data": {
"$push": {
"id_user": "$id_user",
"name": "$name",
"date": "$date",
"text": "$text"
}
}
}},
{ "$sort": { "_id": 1 } }
]
Run Code Online (Sandbox Code Playgroud)
那么两个命令都是正确的
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |