MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongodb aggregiert mehrere Arrays

Zuerst fügen Sie ein Feld voteType hinzu bei jeder Abstimmung. Dieses Feld gibt seinen Typ an. Mit diesem Feld brauchen Sie die Stimmen nicht in zwei getrennten Arrays mlVoters zu speichern und egVoters; Sie können diese Arrays stattdessen zu einem einzigen Array pro Dokument verketten und anschließend auflösen.

An diesem Punkt haben Sie ein Dokument pro Stimme, mit einem Feld, das angibt, um welchen Typ es sich handelt. Jetzt müssen Sie nur noch per E-Mail gruppieren und in der Gruppenphase zwei bedingte Summen durchführen, um zu zählen, wie viele Stimmen jedes Typs für jede E-Mail vorhanden sind.

Abschließend fügen Sie ein Feld totalCount hinzu als Summe der beiden anderen Zählwerte.

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"]
      }
    }
  }
])