はい、これは複数のアレイがあることを考えると少し難しいです。両方を同時に試行すると、一方のアレーがもう一方のアレーの内容を乗算する「デカルト条件」になります。
したがって、最初に配列の内容を組み合わせるだけです。これは、最初にデータを保存する方法を示している可能性があります。
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
をステージングします
演算子は、各配列の各項目に「type」値を追加しています。とにかくすべてのアイテムが「一意」に処理される必要があるため、ここでは実際には重要ではありません。 $setUnion
演算子は、各配列を単一の配列に「連結」します。
前述のように、そもそもこの方法で保存する必要があります。
次に、 $unwind
を処理します
続いて$group
、ここで、各「長所」と「短所」は、 $cond
「type」と一致する場合は、1
を返します。 または0
ここで、一致はそれぞれtrue/false
$sum
アキュムレータ。
これにより、指定されたグループ化キーに従って、集計操作内のそれぞれの「タイプ」をカウントするための「論理一致」が得られます。