Подсчитать количество элементов в массиве соответствующих условию. MongoDB
Имеются 2 коллекции: "shop" и "products". Структура коллекций:
"shop"
_id: "id", name: "shopName", products: ["someProduct", "someProduct", ...]
"products"
_id: "id", name: "productName", price: someNumber
Теперь вопрос: с помощью агрегации найти количество продуктов в каждом магазине, минимальную/максимальную/среднюю стоимость продуктов в магазине, количество продуктов со стоимостью меньше 100. Первые два пункта выполняю, а третий с условием не могу сообразить. Это пример запроса:
"db.shop.aggregate([
{$lookup: {
from: "products",
localField: "products",
foreignField: "name",
as: "products_list"}},
{$unwind: {
path: "$products_list"}},
{$group: {
_id: {name: "$name"},
count_in_shop: {$sum: 1},
avgprice: {$avg: "$products_list.price"},
minprice: {$min: "$products_list.price"},
maxprice: {$max: "$products_list.price"}}},
{$match: {"products_list.price": {$lte: 100}}},
{$count: "count_in_shop_less_100"}
])"
Если убрать $match и $count то всё работает, но с этими последними двумя пунктами не происходит ничего. Подскажите как быть
Ответы (1 шт):
Автор решения: Tema K
→ Ссылка
Попробуй воспользоваться $sum и $cond.
db.shop.aggregate([
{$lookup: {
from: "products",
localField: "products",
foreignField: "name",
as: "products_list"}},
{$unwind: {
path: "$products_list"}},
{$group: {
_id: {name: "$name"},
count_in_shop: {$sum: 1},
avgprice: {$avg: "$products_list.price"},
minprice: {$min: "$products_list.price"},
maxprice: {$max: "$products_list.price"},
count_in_shop_less_100: { $sum: { $cond: [ { $lte: ["$products_list.price", 100]}, 1, 0 ] } } }}
])