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

时间:2018-01-30 13:17:21

标签: mongodb sorting aggregation-framework mongodb-3.6

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

作为示例,从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所述,它将对外部集合进行排序。

1 个答案:

答案 0 :(得分:1)

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

$unwind slots数组,然后将文档日期asc和$group排序回_id以获取已排序的数组。

$sort desc上的

name对文档进行排序。

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