以下是该集合的示例文档。
{
"name": "sam",
"age": 20,
"hobbies": [
{ "id": 1, value: "football" },
{ "id": 2, value: "chess" }
]
},
{
"name": "Bob",
"age": 30,
"hobbies": [
{ "id": 1, "value": "painting" },
{ "id": 2, "value": "gardening" }
]
},
{
"name": "Charlie",
"age": 22,
"hobbies": [
{ "id": 1, "value": "cycling" },
{ "id": 2, "value": "playing the guitar" },
{ "id": 3, "value": "photography" }
]
}
我尝试使用下面的查询,它只对爱好数组进行排序,而不对集合的文档进行排序。
{ $sort: { "hobbies.value": 1 } }
我想根据
hobbies.value
对集合中的文档进行排序,并对数组内的对象进行排序。{
"name": "sam",
"age": 20,
"hobbies": [
{ "id": 2, "value": "chess" },
{ "id": 1, "value": "football" }
]
},
{
"name": "Charlie",
"age": 22,
"hobbies": [
{ "id": 1, "value": "cycling" },
{ "id": 2, "value": "playing the guitar" },
{ "id": 3, "value": "photography" }
]
},
{
"name": "Bob",
"age": 30,
"hobbies": [
{ "id": 1, "value": "painting" },
{ "id": 2, "value": "gardening" }
]
}
您当前的查询正在按降序而不是升序对
hobbies.value
数组进行排序。你应该使用{ "hobbies.value": 1 }
$sortArray
运算符。
db.collection.aggregate([
{
$sort: {
"hobbies.value": 1
}
},
{
$set: {
hobbies: {
$sortArray: {
input: "$hobbies",
sortBy: {
value: 1
}
}
}
}
}
])
按数组字段对文档进行排序并不直观。 来自比较排序顺序文档:
在数组比较中:
小于比较,或升序排序,根据 BSON 类型排序顺序比较数组的最小元素。
大于比较或降序排序,根据反向 BSON 类型排序顺序比较数组的最大元素。
将值为单元素数组的字段(例如,[ 1 ])与非数组字段(例如,2)进行比较时,比较的是 1 和 2。
空数组(例如 [ ])的比较将空数组视为小于空值或缺失字段值。
{$sort:{"hobbies.value":-1}}
会按照 Charlie、Bob、Sam 的顺序对您提供的示例文档进行排序,因为排序时考虑的值为“弹吉他”、“绘画”和“足球”。
要对数组中的值进行排序,请在 $project 或 $addFields 阶段使用 $sortArray 运算符。