Коллекции MongoDB не являются реальными схемами, также, я предполагаю:
Вы интерпретируете их как массивы (хотя это не так), поэтому вы имеете в виду, что в каждой из ваших коллекций есть 2 документа.
Требуется сумма продаж, сгруппированная по категории продукта.
Если это так, то вам нужен агрегат MongoDB, который вы будете запускать в своей коллекции "продаж", "объединить" с коллекцией "product" и сгруппировать по идентификатору категории.
Базовая совокупность для этого будет выглядеть следующим образом:
sells.aggregate([
{
$lookup: {
from: "product",
localField: "productId",
foreignField: "id",
as: "ProductData"
}
},
{
$unwind: "$ProductData"
},
{
$group: {
_id: "$ProductData.catId",
total: { $sum: "$value" }
}
}
]);
Если вы также хотите получить имя категории после агрегирования, все, что вам нужно сделать, это вставить еще один $ lookup в конце конвейера, соединяющегося с коллекцией категорий:
sells.aggregate([
{
$lookup: {
from: "product",
localField: "productId",
foreignField: "id",
as: "ProductData"
}
},
{
$unwind: "$ProductData"
},
{
$group: {
_id: "$ProductData.catId",
total: { $sum: "$value" }
}
},
{
$lookup: {
from: "category",
localField: "_id",
foreignField: "id",
as: "CategoryData"
}
},
{
$unwind: "$CategoryData"
},
{
$project: {
name: "$CategoryData.name",
total: 1
}
}
]);
РЕДАКТИРОВАТЬ (добавление нового запроса к делу в комментарии):
db.getCollection('product').aggregate([
{
$lookup: {
from: "sells",
localField: "id",
foreignField: "productId",
as: "SalesData"
}
},
{
$unwind:
{
path: "$SalesData",
preserveNullAndEmptyArrays: true
}
},
{
$project: {
catId: 1,
value: "$SalesData.value"
}
},
{
$group: {
_id: "$catId",
total: { $sum: "$value" }
}
},
{
$lookup: {
from: "category",
localField: "_id",
foreignField: "id",
as: "CategoryData"
}
},
{
$unwind: "$CategoryData"
},
{
$project: {
name: "$CategoryData.name",
total: 1
}
}
]);