हां, यह देखते हुए थोड़ा कठिन है कि कई सरणियाँ हैं, और यदि आप एक ही समय में दोनों को आज़माते हैं तो आप एक "कार्टेशियन स्थिति" के साथ समाप्त होते हैं जहाँ एक सरणी दूसरे की सामग्री को गुणा करती है।
इसलिए, शुरुआत में केवल सरणी सामग्री को संयोजित करें, जो संभवतः इंगित करता है कि आपको डेटा को पहली जगह में कैसे संग्रहीत करना चाहिए:
Model.aggregate(
[
{ "$project": {
"company": 1,
"model": 1,
"data": {
"$setUnion": [
{ "$map": {
"input": "$pros",
"as": "pro",
"in": {
"type": { "$literal": "pro" },
"value": "$$pro"
}
}},
{ "$map": {
"input": "$cons",
"as": "con",
"in": {
"type": { "$literal": "con" },
"value": "$$con"
}
}}
]
}
}},
{ "$unwind": "$data" }
{ "$group": {
"_id": {
"company": "$company",
"model": "$model",
"tag": "$data.value"
},
"pros": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "pro" ] },
1,
0
]
}
},
"cons": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "con" ] },
1,
0
]
}
}
}
],
function(err,result) {
}
)
तो पहले $project
के जरिए
चरण $map
ऑपरेटर प्रत्येक सरणी के प्रत्येक आइटम में "प्रकार" मान जोड़ रहे हैं। ऐसा नहीं है कि यह वास्तव में यहां मायने रखता है क्योंकि सभी वस्तुओं को वैसे भी "अद्वितीय" संसाधित करना चाहिए, $setUnion
ऑपरेटर प्रत्येक सरणी को एकवचन सरणी में "contatenates" करता है।
जैसा कि पहले उल्लेख किया गया है, आपको शायद पहले स्थान पर इस तरह से भंडारण करना चाहिए।
फिर $unwind
प्रोसेस करें
उसके बाद $group
, जिसमें प्रत्येक "पेशेवर" और "विपक्ष" का मूल्यांकन तब $cond
के लिए यह "प्रकार" से मेल खा रहा है, या तो 1
returning लौटा रहा है या 0
जहां मैच क्रमशः true/false
. है $sum
पर
एकत्रीकरण संचायक।
यह आपको एक "तार्किक मिलान" देता है ताकि निर्दिष्ट समूहीकरण कुंजियों के अनुसार एकत्रीकरण कार्रवाई के भीतर प्रत्येक संबंधित "प्रकार" की गणना की जा सके।