#mongodb #aggregation-framework
#mongodb #агрегация-фреймворк
Вопрос:
У меня есть два запроса агрегации, которые я хочу объединить в один запрос агрегации. Мне интересно, как я могу этого добиться.
Оба запроса говорят о коллекции, Submission
которая в основном относится к status
. Ниже приведены два запроса агрегации :
Агрегация 1: все заявки, сгруппированные по идентификатору бронирования, имеют статус SUCCESS
В идеале я хотел бы получить следующий результат:
{
"_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"
}
}
}
])