📅  最后修改于: 2023-12-03 15:08:43.097000             🧑  作者: Mango
在 MongoDB 中,可以使用 sort()
方法对文档中的字段进行排序。对于对象数组,可以使用 $unwind
操作符将数组展开成单个文档,然后再将文档排序。本文将介绍如何对 MongoDB 中的对象数组进行排序。
假设我们有一个文档包含一个对象数组:
{
"_id": 1,
"items": [
{"name": "item1", "price": 10},
{"name": "item2", "price": 20},
{"name": "item3", "price": 30}
]
}
要按照数组中的某个字段排序,可以使用 $sort
操作符。例如,我们可以按照价格降序对数组进行排序:
db.collection.aggregate([
{ $match: { "_id": 1 } },
{ $unwind: "$items" },
{ $sort: { "items.price": -1 } },
{ $group: { "_id": "$_id", "items": { $push: "$items" } } }
])
这个聚合管道首先使用 $match
操作符筛选出 _id
等于 1 的文档。然后使用 $unwind
操作符将 items
数组变成单个文档。接着使用 $sort
操作符按照 items.price
字段进行降序排序。最后使用 $group
操作符将文档合并成一个文档,其中 items
是一个数组,包含排序后的所有元素。
我们还可以按照数组中的索引进行排序。MongoDB 使用 $project
操作符将数组中的索引作为字段,然后再使用 $sort
操作符对这些字段进行排序。例如,以下聚合管道按照索引升序对 items
数组进行排序:
db.collection.aggregate([
{ $match: { "_id": 1 } },
{ $project: {
"items": {
$map: {
input: { $range: [0, { $size: "$items" }] },
as: "idx",
in: "$items.$$idx"
}
}
}},
{ $unwind: "$items" },
{ $sort: { "items.idx": 1 } },
{ $group: { "_id": "$_id", "items": { $push: "$items.item" } } }
])
这个聚合管道首先使用 $match
操作符筛选出 _id
等于 1 的文档。然后使用 $project
操作符将 items
数组的索引作为字段,生成一个新的 items
数组。接着使用 $unwind
操作符将 items
数组变成单个文档。使用 $sort
操作符按照 items.idx
字段进行升序排序。最后使用 $group
操作符将文档合并成一个文档,其中 items
是一个数组,包含排序后的所有元素。
在 MongoDB 中对对象数组进行排序,可以使用 $unwind
操作符和 $sort
操作符。还可以将数组的索引作为字段,使用 $project
操作符进行排序。这些方法可以实现各种复杂的数组排序逻辑。