sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB samlet antal varer i to arrays på tværs af forskellige dokumenter?

Ja, det er lidt sværere i betragtning af, at der er flere arrays, og hvis du prøver begge på samme tid, ender du med en "kartesisk tilstand", hvor den ene array multiplicerer indholdet af den anden.

Derfor skal du bare kombinere array-indholdet i begyndelsen, hvilket sandsynligvis indikerer, hvordan du skal gemme dataene i første omgang:

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) {

    }
)

Så via det første $project iscenesætte $map operatører tilføjer "type" værdien til hvert element i hvert array. Ikke at det virkelig betyder noget her, da alle elementer skal behandles "unik" alligevel, $setUnion operatoren "sammensætter" hvert array til et enkelt array.

Som nævnt tidligere, bør du sandsynligvis opbevare på denne måde i første omgang.

Behandl derefter $unwind efterfulgt af $group , hvor hver "pros" og "cons" derefter evalueres via $cond for at det matcher "type", enten returnerer 1 eller 0 hvor matchet er henholdsvis true/false til $sum aggregeringsakkumulator.

Dette giver dig et "logisk match" for at tælle hver respektive "type" i aggregeringsoperationen i henhold til de specificerede grupperingsnøgler.




  1. MongoDB:Milliarder af dokumenter i en samling

  2. hvor mange samlede forbindelser eller max forbindelser er tilgængelige i Redis Server?

  3. Korrekt måde at importere json-fil til mongo

  4. Find dokumenter, hvis matrixfelt indeholder mindst n elementer af en given matrix