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

Aggregazione con più criteri e corrispondenza della somma in base alla chiave di conteggio

Poiché ci sono due raccolte, dobbiamo usare

  • $lookup per partecipare a collezioni di rimorchio. Qui ho usato non correlato sottoquery
  • L'aggregazione viene eseguita in colA raccolte, ma all'interno della lookup pipeline di eseguiamo l'aggregazione su colB . $unwind aiuta a destrutturare gli items . $match aiuta a eliminare i dati indesiderati (la fase di corrispondenza richiede $expr ).
  • Una volta che il nostro join è riuscito, dobbiamo semplicemente contare l'array usando $size
  • $reduce aiuta a sommare il valore dell'array di size

Lo script mongo è riportato di seguito.

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"
            ]
          }
        }
      }
    }
  }
])

Lavoro parco giochi Mongo