sql >> Databáze >  >> NoSQL >> MongoDB

mongodb agreguje více polí

Nejprve přidáte pole voteType v každém hlasování. Toto pole označuje jeho typ. Pokud máte toto pole, nemusíte mít hlasy ve dvou samostatných polích mlVoters a egVoters; místo toho můžete tato pole zřetězit do jednoho pole na dokument a poté je rozvinout.

V tomto okamžiku máte jeden dokument na hlas s polem, které označuje, o jaký typ se jedná. Nyní se jednoduše musíte seskupit podle e-mailu a ve fázi skupiny provést dva podmíněné součty, abyste spočítali, kolik hlasů každého typu je pro každý e-mail.

Nakonec přidáte pole totalCount jako součet ostatních dvou počtů.

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. aktualizovat více prvků v poli mongodb

  2. upsert pole ve vnořeném dokumentu v poli podle indexu v MongoDB

  3. Připojte se k mongodb běžícímu uvnitř Dockeru

  4. Přehled databázových provozních sestav v ClusterControl