gpt4 book ai didi

node.js - 使用 $group(aggregation) 返回多个对象

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:57 24 4
gpt4 key购买 nike

我有一个与此类似的集合:

[
{
"_id":1,
"name":"breakfast",
"time":"10.00"
},
{
"_id":3,
"name":"lunch",
"time":"12.07"
},
{
"_id":2,
"name":"breakfast",
"time":"10.10"
},
{
"_id":4,
"name":"lunch",
"time":"12.45"
}
]

我想聚合成这样的东西:

{
"breakfast":[
{
"_id":1,
"name":"breakfast",
"time":"10.00"
},
{
"_id":2,
"name":"breakfast",
"time":"10.10"
}
],
"lunch":[
{
"_id":3,
"name":"lunch",
"time":"12.07"
},
{
"_id":4,
"name":"lunch",
"time":"12.45"
}
]
}

我只能将它们分组,但无法根据膳食将主餐更改为早餐或午餐。名称(组名称)

$group: {
_id: { meal: '$meal.name' },
meals: { $push: '$meal' },
}

使用上面的代码我成功地产生了下面的输出。我唯一的挑战是将主要膳食更改为早餐或午餐,如上面在子组中所述。

{
"meals":[
{
"_id":1,
"name":"breakfast",
"time":"10.00"
},
{
"_id":2,
"name":"breakfast",
"time":"10.10"
}
],
"meals":[
{
"_id":3,
"name":"lunch",
"time":"12.07"
},
{
"_id":4,
"name":"lunch",
"time":"12.45"
}
]
}

最佳答案

在这里你可以得到答案。
在“分组”添加到数组后,您同样可以通过 "name" 分组键将所有内容 $push 到数组中,然后使用 $arrayToObject 将其转换为 $replaceRoot 中文档的键:

db.collection.aggregate([
{ "$group": {
"_id": "$name",
"data": { "$push": "$$ROOT" }
}},
{ "$group": {
"_id": null,
"data": {
"$push": {
"k": "$_id",
"v": "$data"
}
}
}},
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$data" }
}}
])

输出

[
{
"breakfast": [
{
"_id": 1,
"name": "breakfast",
"time": "10.00"
},
{
"_id": 2,
"name": "breakfast",
"time": "10.10"
}
],
"lunch": [
{
"_id": 3,
"name": "lunch",
"time": "12.07"
},
{
"_id": 4,
"name": "lunch",
"time": "12.45"
}
]
}
]

您可以在这个LINK中查看上述查询的结果

关于node.js - 使用 $group(aggregation) 返回多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com