$ arrayToObject
の使用を活用できます
一連のパイプライン内の演算子と最後の $ replaceRoot コード>
目的の結果を得るためのパイプライン。
注 :hubId
パイプライン操作中に $arrayToObject<として文字列に変換されます/ code>
「key」値が文字列の場合、演算子は適切に機能します。したがって、
hubId
の場合 はObjectIdであり、 $ toString
$ arrayToObject
の場合に必要です
適用されます。
次の集約パイプラインを実行する必要があります:
Product.aggregate([
{ "$group": {
"_id": {
"hubId": "$hubId",
"status": "$ProductStatus"
},
"count": { "$sum": 1 }
} },
{ "$group": {
"_id": "$_id.hubId",
"counts": {
"$push": {
"k": "$_id.status",
"v": "$count"
}
}
} },
{ "$group": {
"_id": null,
"counts": {
"$push": {
"k": { "$toString": "$_id" },
"v": "$counts"
}
}
} },
{ "$addFields": {
"counts": {
"$map": {
"input": "$counts",
"in": {
"$mergeObjects": [
"$$this",
{ "v": { "$arrayToObject": "$$this.v" } }
]
}
}
}
} },
{ "$replaceRoot": {
"newRoot": { "$arrayToObject": "$counts" }
} }
])
これにより、次の結果ドキュメントが生成されます。
{
"xyz" : {
"Delivered" : 1,
"On the Way" : 1
},
"mlm" : {
"On the Way" : 1,
"Delivered" : 2
},
"yyy" : {
"On the Way" : 1,
"Delivered" : 1,
"Cancelled" : 1
}
}
もちろん、これはカウントがゼロの他のステータスを生成しませんが、ソリューションは良い出発点になる可能性があります。