sql >> データベース >  >> NoSQL >> MongoDB

MongoDBは、異なるドキュメントにまたがる2つの配列のアイテムの数を集計しますか?

    はい、これは複数のアレイがあることを考えると少し難しいです。両方を同時に試行すると、一方のアレーがもう一方のアレーの内容を乗算する「デカルト条件」になります。

    したがって、最初に配列の内容を組み合わせるだけです。これは、最初にデータを保存する方法を示している可能性があります。

    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 アキュムレータ。

    これにより、指定されたグループ化キーに従って、集計操作内のそれぞれの「タイプ」をカウントするための「論理一致」が得られます。




    1. MongoDB$ninクエリ演算子

    2. マングース:_docはどうしたの?

    3. MongoCollection<Document>で検索

    4. MongoDB $ isoWeek