Compter les éléments d'un autre document dans l'agrégation mongodb

Nov 17 2020

J'ai deux documents distincts comme

Accounts
[
  {_id:1, name:'xyz'},
  {_id:2, name:'abc'},
  {_id:3, name:'def'},
  {_id:4, name:'pqr'},
]

et

Responses
[
  {_id:01, accountId:2, questionId: 0001, res: true},
  {_id:02, accountId:2, questionId: 0002, res: true},
  {_id:03, accountId:1, questionId: 0003, res: false},
  {_id:03, accountId:3, questionId: 0002, res: false},
  {_id:03, accountId:2, questionId: 0003, res: false},
]

Comment puis-je compter le nombre de réponses vraies et fausses pour un compte individuel tout en conservant ses champs d'origine également.

Par exemple.

{
  _id: 2,
  name: 'abc',
  trueResponses: 2,
  falseResponses: 1
}

J'ai essayé d'utiliser $ lookup pour joindre l'autre document dans un champ mais je ne peux pas compter les différentes réponses.

db.accounts.aggregate([
    {
        $match: { _id: 2 }
    },
    {
        $lookup:{
            from: 'responses',
            localField: '_id',
            foreignField: 'accountId',
            as: 'responses'
        }
    }
])

Réponses

1 varman Nov 18 2020 at 03:36

Il y a plusieurs façons,

  • $match éliminer les données indésirables
  • $lookup rejoindre des collections
  • $unwind pour déconstruire le tableau
  • $grouppour reconstruire le tableau et $sumaide à augmenter de 1 en utilisant la $condcondition

Voici le script

db.Accounts.aggregate([
  { $match: { _id: 2 } }, { $lookup: {
      from: "Responses",
      localField: "_id",
      foreignField: "accountId",
      as: "responses"
    }
  },
  {
    $unwind: "$responses"
  },
  {
    $group: { _id: "$_id",
      name: { $first: "$name" },
      trueResponses: {
        $sum: { $cond: [{ $eq: [ "$responses.res", true]},1,0]
        }
      },
      falseResponses: {
        $sum: { $cond: [{ $eq: [ "$responses.res", false]},1,0]
        }
      }
    }
  }
])

Travail aire de jeux Mongo