sql >> Database >  >> NoSQL >> MongoDB

mongodb aggregeert meerdere arrays

Eerst voeg je een veld toe voteType bij elke stem. Dit veld geeft het type aan. Met dit veld hoeft u de stemmen niet in twee aparte arrays te bewaren mlVoters en egVoters; je kunt in plaats daarvan die arrays samenvoegen tot een enkele array per document en daarna ontspannen.

Op dit moment heb je één document per stem, met een veld dat aangeeft om welk type het gaat. Nu hoeft u alleen maar per e-mail te groeperen en in de groepsfase twee voorwaardelijke sommen uit te voeren om te tellen hoeveel stemmen van elk type er zijn voor elke e-mail.

Als laatste voeg je een veld toe totalCount als de som van de andere twee telt.

db.documents.aggregate([
  {
    $addFields: {
      mlVoters: {
        $ifNull: [ "$mlVoters", []]
      },
      egVoters: {
        $ifNull: [ "$egVoters", []]
      }
    }
  },
  {
    $addFields: {
      "mlVoters.voteType": "ml",
      "egVoters.voteType": "eg"
    }
  },
  {
    $project: {
      voters: { $concatArrays: ["$mlVoters", "$egVoters"] }
    }
  },
  {
    $unwind: "$voters"
  },
  {
    $project: {
      email: "$voters.email",
      voteType: "$voters.voteType"
    }
  },
  {
    $group: {
      _id: "$email",
      mlCount: {
        $sum: {
          $cond: {
            "if": { $eq: ["$voteType", "ml"] },
            "then": 1,
            "else": 0
          }
        }
      },
      egCount: {
        $sum: {
          $cond: {
            "if": { $eq: ["$voteType", "eg"] },
            "then": 1,
            "else": 0
          }
        }
      }
    }
  },
  {
    $addFields: {
      totalCount: {
        $sum: ["$mlCount", "$egCount"]
      }
    }
  }
])



  1. Redis tcp-achterstand

  2. Sane standaardwaarden voor MongoDB op OSX?

  3. Hoe verwijder ik vastgelopen/verouderde Resque-werknemers?

  4. Hoe MongoDB 4.2 op RedHat/ CentOS 7-systemen te installeren