Как поменять агрегатный $group, который возвращает null при $lookup`е пустого массива?

Когда агрегатная операция $lookup в MongoDB возвращает пустой массив, то агрегатная операция $group возвращает null. Однако, есть несколько способов изменить такое поведение и обработать пустой массив.

1. Используйте агрегатную операцию $unwind перед $group. Агрегатная операция $unwind разбивает массивы на отдельные элементы. Если ваш $lookup возвращает пустой массив, то $unwind не создаст никаких документов. Затем, вы можете выполнить $group на развернутых элементах и получить желаемый результат. Вот пример такой агрегатной операции:

db.collection.aggregate([
  {
    $lookup: {
      from: "otherCollection",
      localField: "field",
      foreignField: "field",
      as: "result"
    }
  },
  { $unwind: "$result" },
  { 
    $group: {
      _id: "$_id",
      count: { $sum: 1 },
      resultArray: { $push: "$result" }
    }
  }
])

2. Используйте агрегатную операцию $ifNull вместо $group. Агрегатная операция $ifNull позволяет проверять, является ли выражение null, и возвращать другое значение, если оно таковым является. Вы можете использовать $ifNull для замены null на пустой массив, когда $lookup возвращает пустой результат. Например:

db.collection.aggregate([
  {
    $lookup: {
      from: "otherCollection",
      localField: "field",
      foreignField: "field",
      as: "result"
    }
  },
  {
    $project: {
      result: { $ifNull: ["$result", []] }
    }
  }
])

3. Используйте агрегатную операцию $facet. Агрегатная операция $facet позволяет выполнять несколько независимых операций на одних и тех же данных. Вы можете использовать $facet для получения отдельного результата для $lookup и проверять, является ли результат пустым массивом. Вот пример такой агрегатной операции:

db.collection.aggregate([
  {
    $facet: {
      lookupResult: [
        {
          $lookup: {
            from: "otherCollection",
            localField: "field",
            foreignField: "field",
            as: "result"
          }
        }
      ],
      checkEmpty: [
        {
          $project: {
            isEmpty: { $eq: [{ $size: "$lookupResult.result" }, 0] }
          }
        }
      ]
    }
  },
  {
    $project: {
      lookupResult: {
        $cond: [
          { $eq: ["$checkEmpty.isEmpty", true] },
          [],
          "$lookupResult.result"
        ]
      }
    }
  }
])

Вышеупомянутые способы позволят вам изменить поведение агрегатной операции $group и получить желаемый результат, даже когда $lookup возвращает пустой массив.