我有一个这样的收藏:
[
{
"name": "Banana",
"variants": [
{
"color": "blue",
"props": []
},
{
"color": "green",
"props": [
{
"uid": 1,
"grade": 3
},
{
"uid": 3,
"grade": 2
}
]
}
]
}
]
对于查询结果中的每个文档,
variants
数组应按条件“props为空”与“props不为空”排序,首先列出包含props的变体。在示例中,颜色为 green
的变体应该位于第一个,因为它有 props,其次是颜色为 blue
的变体,因为它不包含任何 props。
期望的结果:
[
{
"name": "Banana",
"variants": [
{
"color": "green",
"props": [
{
"grade": 3,
"uid": 1
},
{
"grade": 2,
"uid": 3
}
]
},
{
"color": "blue",
"props": []
}
]
}
]
在文档中只有按文档字段和排序方向排序的示例,不幸的是我没有看到按自定义评估排序的选项。
感谢您的帮助!
在执行
length
之前,您可以通过向 variants
数组中的每个对象添加 $sortArray
字段来定义排序标准。
然后删除
variants.length
字段。
db.collection.aggregate([
{
$set: {
variants: {
$sortArray: {
input: {
$map: {
input: "$variants",
in: {
$mergeObjects: [
"$$this",
{
length: {
$size: "$$this.props"
}
}
]
}
}
},
sortBy: {
length: -1
}
}
}
}
},
{
$unset: [
"variants.length"
]
}
])