sql >> Base de Datos >  >> NoSQL >> MongoDB

mongodb agrega múltiples matrices

Primero agrega un campo voteType en cada voto. Este campo indica su tipo. Al tener este campo, no necesita mantener los votos en dos matrices separadas mlVoters y egVoters; en su lugar, puede concatenar esas matrices en una sola matriz por documento y relajarse después.

En este punto tienes un documento por voto, con un campo que indica de qué tipo es. Ahora solo necesitas agrupar por correo electrónico y, en la fase de grupos, realizar dos sumas condicionales para contar cuántos votos de cada tipo hay para cada correo electrónico.

Finalmente agregas un campo totalCount como la suma de los otros dos recuentos.

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