sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb aggregerar flera arrayer

Först lägger du till ett fält voteType i varje omröstning. Detta fält anger dess typ. Med det här fältet behöver du inte behålla rösterna i två separata arrayer mlVoters och egVoters; du kan istället sammanfoga dessa arrayer till en enda array per dokument och koppla av efteråt.

Vid det här laget har du ett dokument per röst, med ett fält som anger vilken typ det är. Nu behöver du helt enkelt gruppera via e-post och, i gruppspelet, utföra två villkorade summor för att räkna hur många röster av varje typ det finns för varje e-postmeddelande.

Slutligen lägger du till ett fält totalCount som summan av de andra två räknas.

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. Mappa en "array av objekt" till en enkel uppsättning nyckelvärden

  2. MongoDB/PyMongo:Frågar flera kriterier - oväntade resultat

  3. hur implementerar man oändlig rullningspaginering i Angular 5?

  4. Hur kör man MongoDB och Mongo-express med docker-compose?