sql >> Database teknologi >  >> NoSQL >> MongoDB

mongodb samler flere arrays

Først tilføjer du et felt voteType ved hver afstemning. Dette felt angiver dens type. Når du har dette felt, behøver du ikke at opbevare stemmerne i to separate arrays mlVoters og egVoters; du kan i stedet sammenkæde disse arrays i et enkelt array pr. dokument og slappe af bagefter.

På dette tidspunkt har du ét dokument pr. stemme, med et felt, der angiver, hvilken type det er. Nu skal du blot gruppere via e-mail og i gruppefasen udføre to betingede summer for at tælle hvor mange stemmer af hver type der er for hver e-mail.

Til sidst tilføjer du et felt totalCount som summen af ​​de to andre tæller.

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. Installer MongoDB Community Edition 4.0 på Linux

  2. Mongoose MODEL update() vs save()

  3. Hent ét element fra en række objekter, der er en del af ét dokument (mongoose)

  4. Opdater dobbelt indlejret array mongodb