Orders.aggregate([{$match: { shippingType: "standardShipping" }},
                   { $project: { standardShippingCount: { $size: "$products" } } },
                  ])

   Orders.aggregate([{$match: { shippingType: "expressShipping" } },
                { $project: { expressShippingCount: { $size: "$products" } } },
                ])

Мне нужна помощь, чтобы узнать, можно ли написать эти 2 запроса в 1. Любая помощь прилагается.

1
ertemishakk 16 Сен 2021 в 14:33

2 ответа

Лучший ответ

Если вам нужно только общее количество products, заказанных с каждым shippingType из всей коллекции, вы можете использовать этот агрегированный запрос

[
  {
    $unwind: {
      path: "$products"
    },
  },
  {
    $group: {
      _id: "$shippingType",
      count: {
        $count: {}
      }
    }
  },
]

Он даст вам ответ в этом формате

[
  {
    "_id": "expressShipping",
    "count": 14
  },
  {
    "_id": "standardShipping",
    "count": 6
  }
]

Теперь, чтобы преобразовать его в формат, подходящий для вашего случая использования.

queryResponse.reduce((acc, curr) => {
  acc[`${curr._id}Count`] = curr.count;
  return acc;
}, {})

Наконец-то у вас будет это

{
  expressShippingCount: 14,
  standardShippingCount: 6
}
0
Hamza Asif 16 Сен 2021 в 12:34

Запрос

  • $in работает как или, вы также можете использовать $or, но $in легче добавить много значений с более кратким синтаксисом
  • проект в том виде, в каком он был у вас
Orders.aggregate(
[ {
  "$match" : {
    "shippingType" : {
      "$in" : [ "standardShipping", "expressShipping" ]
    }
  }
}, {
  "$project" : {
    "standardShippingCount" : {
      "$size" : "$products"
    }
  }
} ]
)
0
Takis _ 17 Сен 2021 в 00:04