MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mongodb agrège plusieurs tableaux

Vous ajoutez d'abord un champ voteType à chaque vote. Ce champ indique son type. Avec ce champ, vous n'avez pas besoin de conserver les votes dans deux tableaux distincts mlVoters et egVoters; vous pouvez à la place concaténer ces tableaux en un seul tableau par document, et dérouler ensuite.

À ce stade, vous avez un document par vote, avec un champ qui indique de quel type il s'agit. Il vous suffit maintenant de vous regrouper par e-mail et, lors de la phase de groupes, d'effectuer deux sommes conditionnelles pour compter le nombre de votes de chaque type pour chaque e-mail.

Enfin vous ajoutez un champ totalCount comme la somme des deux autres comptes.

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