gpt4 book ai didi

node.js - 如何使用groupby获取分组并在mongoDB中获取动态状态的结果

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:16 25 4
gpt4 key购买 nike

我有如下的集合

{
"_id" : ObjectId("5b6538704ba0292b6c197770"),
"Name":"Name1",
"Status":"Good",


},
{
"_id" : ObjectId("5b6538704ba0292b6c197773"),
"Name":"Name2",
"Status":"Bad"
},
{
"_id" : ObjectId("5b6538704ba0292b6c197774"),
"Name":"Name3",
"Status":"Bad"
},{
"_id" : ObjectId("5b6538704ba0292b6c197774"),
"Name":"Name1",
"Status":"Bad"
},
{
"_id" : ObjectId("5b6538704ba0292b6c197775"),
"Name":"Name1",
"Status":"Good"
}

我已经使用查询来获取状态明智计数,如下所示

db.Students.aggregate( [

{ $group: { _id: {
"Name": "$Name","Status":"$Status"}, StatusCount: { $sum: 1 } } }
, { "$project": { _id: 0, Name: "$_id.Name",Status : "$_id.Status", StatusCount:1 } }
] );

结果是

{
"Name":"Name1",
"StatusCount" : 2,
"Status" : "Good"

},
{
"Name":"Name2",
"StatusCount" : 1,
"Status" : "Bad"
}, {
"Name":"Name2",
"StatusCount" : 1,
"Status" : "Bad"
},
{
"Name":"Name1",
"StatusCount" : 1,
"Status" : "Bad"
}

我正在接近的结果是这样的

   {
"Name":"Name1",
"Good" : 2,
"Bad" :1
},
{
"Name":"Name2",
"Good" : 0,
"Bad" :1
}

我期望的结果是字段名称的状态并计为其值。我曾尝试这样做,但未能实现。目前,状态只有“好”或“坏”两种,但在实际数据集中可能会增加。

最佳答案

通过使用$arrayToObject 运算符和最后一个 $replaceRoot 管道步骤,其中有 $mergeObjects 运算符您将得到您想要的结果。

您需要在 MongoDB Server 3.4.4 或更高版本上运行以下聚合管道:

const pipeline = [
{ '$group': {
'_id': {
'Name': '$Name',
'Status': '$Status'
},
'StatusCount': { '$sum': 1 }
} },
{ '$group': {
'_id': '$_id.Name',
'counts': {
'$push': {
'k': '$_id.Status',
'v': '$StatusCount'
}
}
} },
{ '$replaceRoot': {
'newRoot': { '$mergeObjects': [
{ '$arrayToObject': '$counts' },
{ 'Name': '$_id' }
] }
} }
];

db.Students.aggregate(pipeline);

关于node.js - 如何使用groupby获取分组并在mongoDB中获取动态状态的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51683881/

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