如何在对外部文档保持不同排序的同时对内部数组元素进行排序?

How to sort inner array elements while maintaining different sorting for outer documents?

我有一组文档,每个文档都有一个嵌入式数组。 我需要每个数组的元素在其内部进行排序,而包含的文档应保持原样排序。

举个例子,取this similar question的数据排序:

[
    {
        name: 'item1',
        slots: [
            { date : ISODate("2013-01-18T23:00:00Z") },
            { date : ISODate("2013-02-05T23:00:00Z") },
            { date : ISODate("2013-03-24T23:00:00Z") },
        ]
    },
    {
        name: 'item2',
        slots: [
            { date : ISODate("2013-01-12T23:00:00Z") },
            { date : ISODate("2013-01-03T23:00:00Z") },
            { date : ISODate("2013-03-04T23:00:00Z") },
        ]
    },
    {
        name: 'item3',
        slots: [
            { date : ISODate("2013-03-14T23:00:00Z") },
            { date : ISODate("2013-02-18T23:00:00Z") },
            { date : ISODate("2013-03-07T23:00:00Z") },
        ]
    }
]

我的预期结果略有不同:

[
    {
        name: 'item3',
        slots: [
            { date : ISODate("2013-02-18T23:00:00Z") },
            { date : ISODate("2013-03-07T23:00:00Z") },
            { date : ISODate("2013-03-14T23:00:00Z") },
        ]
    },
    {
        name: 'item2',
        slots: [
            { date : ISODate("2013-01-03T23:00:00Z") },
            { date : ISODate("2013-01-12T23:00:00Z") },
            { date : ISODate("2013-03-04T23:00:00Z") },
        ]
    },
    {
        name: 'item1',
        slots: [
            { date : ISODate("2013-01-18T23:00:00Z") },
            { date : ISODate("2013-02-05T23:00:00Z") },
            { date : ISODate("2013-03-24T23:00:00Z") },
        ]
    }
]

如何在 MongoDB 3.6 中实现这一点?如果可能的话,我想使用聚合管道。

到目前为止我没有尝试太多,因为我认为唯一适合这个的阶段是 $sort,但如前所述 in the documentation,它将对外部集合进行排序。

您可以使用以下聚合查询。

$unwind slots 数组,然后对文档日期 asc 进行排序,然后 $group 回到 _id 以获得排序后的数组。

$sortname desc 上对文档进行排序。

db.col.aggregate([
  {"$unwind":"$slots"},
  {"$sort":{"slots.date":1}},
  {"$group":{"_id":"$_id","name":{"$first":"$name"},"slots":{"$push":"$slots"}}},
  {"$sort":{"name":-1}},
])