对mongodb中的嵌套项进行排序并添加序列号



我有MongoDB集合,包含以下文档:

{
"name": "First parent",
"items": [
{ "name": "First child", "value": 32 },
{ "name": "Second child", "value": 76 },
{ "name": "Third child", "value": 13 }
]
}
{
"name": "Second parent",
"items": [
{ "name": "Fifth child", "value": 16 },
{ "name": "Sixth child", "value": 15 }
]
}
{
"name": "Third parent",
"items": [
{ "name": "Fourth child", "value": 56 }
]
}

我想:

  • 根据(desc(中每个父对象中的CCD_ 1对子对象进行排序
  • 根据第一(最高(子(desc(的CCD_ 2对父母进行排序
  • items.order添加到每个子项

所以所需的输出应该是:

{
"name": "First parent",
"items": [
{ "name": "Second child", "value": 76, "order": 1 }, // Should be first in array, because 76 < 32 < 13. Should have order: 1, because 76 is highest value of all children in collection.
{ "name": "First child", "value": 32, "order": 3 },
{ "name": "Third child", "value": 13, "order": 6 }
]
}
{
"name": "Third parent",
"items": [
{ "name": "Fourth child", "value": 56, "order": 2 } // Should have order: 2, because 56 is second highest value of all children in collection.
]
}
{
"name": "Second parent",
"items": [
{ "name": "Fifth child", "value": 16, "order": 4 },
{ "name": "Sixth child", "value": 15, "order": 5 }
]
}

有办法做到这一点吗?我只有这个(没有items.order属性(:

db.collection.aggregate([
{ "$unwind": "$items" },
{ "$sort": { "items.value": -1 } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"items": { "$push": "$items" }}
},
{ "$sort": { "items.value": -1 } }
])

引入一个键来获取项数组第一个元素的第一个值。然后按它排序。

[
{
"$unwind": {
path: "$items"
}
},
{
"$sort": {
"items.value": -1
}
},
{
"$group": {
"_id": "$_id",
"name": {
"$first": "$name"
},
topValue: {
$first: "$items.value"
},
"items": {
"$push": "$items"
}
}
},
{
"$sort": {
"topValue": -1
}
},
{
"$project": {
topValue: 0
}
}
]

工作Mongo游乐场

最新更新