在聚合结果中对子数组进行排序

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)

什么是正确的方法?

Bla*_*ven 4

如果你希望“数组”中的项目按“升序”排列,那么你的$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)

那么两个命令都是正确的