Как объединить две отдельные агрегации Mongo в одну агрегацию?

#mongodb #aggregation-framework

#mongodb #агрегация-фреймворк

Вопрос:

У меня есть два запроса агрегации, которые я хочу объединить в один запрос агрегации. Мне интересно, как я могу этого добиться.

Оба запроса говорят о коллекции, Submission которая в основном относится к status . Ниже приведены два запроса агрегации :

Агрегация 1: все заявки, сгруппированные по идентификатору бронирования, имеют статус SUCCESS

Агрегация 2: заявки, сгруппированные по идентификатору бронирования, имеют по крайней мере одну ошибку статуса

В идеале я хотел бы получить следующий результат:

 {
    "_id": null,
    "successBookingIds": [
      "NW111"
    ],
    "errorBookingIds": [
      "NW115"
    ]
}
  

Как я могу добиться этого наилучшим образом? Принимая во внимание производительность.

Ответ №1:

Вы можете достичь этого варианта использования, используя этап $facet

 db.collection.aggregate([
  {
    $match: {
      sent: false
    }
  },
  {
    $group: {
      _id: "$bookingId",
      status: {
        $addToSet: "$status"
      }
    }
  },
  {
    $facet: {
      success: [
        {
          $match: {
            status: {
              $nin: [
                "ERROR"
              ]
            }
          }
        },
        {
          $match: {
            status: {
              $in: [
                "SUCCESS"
              ]
            }
          }
        },
        {
          $project: {
            success: "$_id",
            _id: 0
          }
        }
      ],
      error: [
        {
          $match: {
            status: {
              $in: [
                "ERROR"
              ]
            }
          }
        },
        {
          $project: {
            error: "$_id",
            _id: 0
          }
        }
      ]
    }
  },
  {
    $project: {
      concat: {
        "$concatArrays": [
          "$error",
          "$success"
        ]
      }
    }
  },
  {
    $unwind: "$concat"
  },
  {
    $group: {
      _id: null,
      successBookingIds: {
        $push: "$concat.success"
      },
      errorBookingIds: {
        $push: "$concat.error"
      }
    }
  }
])

  

Смотрите Рабочий запрос на игровой площадке MongoDB