MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mongodb agregar vários arrays


Primeiro você adiciona um campo voteType em cada voto. Este campo indica seu tipo. Tendo este campo, você não precisa manter os votos em dois arrays separados mlVoters e egVoters; em vez disso, você pode concatenar essas matrizes em uma única matriz por documento e desenrolar depois.

Neste ponto você tem um documento por voto, com um campo que indica de que tipo é. Agora basta agrupar por e-mail e, na fase de grupos, realizar duas somas condicionais para contar quantos votos de cada tipo existem para cada e-mail.

Finalmente, você adiciona um campo totalCount como a soma das outras duas contagens.
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"]
      }
    }
  }
])