如何在对外部文档保持不同排序的同时对内部数组元素进行排序?
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
以获得排序后的数组。
$sort
在 name
desc 上对文档进行排序。
db.col.aggregate([
{"$unwind":"$slots"},
{"$sort":{"slots.date":1}},
{"$group":{"_id":"$_id","name":{"$first":"$name"},"slots":{"$push":"$slots"}}},
{"$sort":{"name":-1}},
])
我有一组文档,每个文档都有一个嵌入式数组。 我需要每个数组的元素在其内部进行排序,而包含的文档应保持原样排序。
举个例子,取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
以获得排序后的数组。
$sort
在 name
desc 上对文档进行排序。
db.col.aggregate([
{"$unwind":"$slots"},
{"$sort":{"slots.date":1}},
{"$group":{"_id":"$_id","name":{"$first":"$name"},"slots":{"$push":"$slots"}}},
{"$sort":{"name":-1}},
])