MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Agregação com vários critérios e correspondência de soma com base na chave de contagem


Como existem duas coleções, precisamos usar
  • $lookup para juntar-se a coleções de reboque. Aqui eu usei uncorelated subconsultas
  • A agregação é realizada em colA coleções, mas dentro da lookup 's pipeline realizamos agregação em colB . $unwind ajuda a desestruturar os items . $match ajuda a eliminar dados indesejados (o estágio de correspondência requer $expr ).
  • Depois que nossa junção for bem-sucedida, precisamos apenas contar o array usando $size
  • $reduce ajuda a somar o valor do array de size

O script do mongo é dado abaixo.
db.colA.aggregate([
  {
    $lookup: {
      from: "colB",
      let: {
        bid: "$_id"
      },
      pipeline: [
        {
          $match: {
            $or: [
              {
                is_delete: false
              },
              {
                is_delete: {
                  "$exists": false
                }
              }
            ]
          }
        },
        {
          $unwind: "$items"
        },
        {
          $match: {
            $expr: {
              $eq: [
                "$items._id",
                "$$bid"
              ]
            }
          }
        },
        
      ],
      as: "data"
    }
  },
  {
    $project: {
      count: {
        $reduce: {
          input: "$data",
          initialValue: 0,
          in: {
            $add: [
              "$$value",
              "$$this.items.size"
            ]
          }
        }
      }
    }
  }
])

Trabalhando Mongo playground