#mongodb #mongoose #lookup
#mongodb #mongoose #поиск
Вопрос:
Я хочу объединить 2 коллекции: заказ и продукты и сгруппировать по _id, общая сумма (количество * цена) Коллекция («Продукты»)
{ "_id" : "P001", "name" : "Product A", "description" : "for Việt Nam", "price" : 900 },
{ "_id" : "P002", "name" : "Product B", "description" : "for Việt Nam", "price" : 800 },
{ "_id" : "P003", "name" : "Product C", "description" : "for USA", "price" : 1000 },
{ "_id" : "P004", "name" : "Product D", "description" : "for Japan", "price" : 1500 },
{ "_id" : "P005", "name" : "Product E", "description" : "for Japan", "price" : 1100 },
Коллекция («Заказ»)
{ "_id" : "8001", "userId" : "U01", "createdAt" : ISODate("2021-08-01T00:00:00Z"), "products" : [ { "productId" : "P001", "quantity" : 1 }, { "productId" : "P003", "quantity" : 3 } ] },
{ "_id" : "8002", "userId" : "U02", "createdAt" : ISODate("2021-08-01T00:00:00Z"), "products" : [ { "productId" : "P003", "quantity" : 5 }, { "productId" : "P004", "quantity" : 2 } ] },
{ "_id" : "8003", "userId" : "U01", "createdAt" : ISODate("2021-08-02T00:00:00Z"), "products" : [ { "productId" : "P002", "quantity" : 2 }, { "productId" : "P004", "quantity" : 5 } ] },
{ "_id" : "8004", "userId" : "U03", "createdAt" : ISODate("2021-08-03T00:00:00Z"), "products" : [ { "productId" : "P001", "quantity" : 4 }, { "productId" : "P005", "quantity" : 3 } ] },
Результат:
{ "_id" : { "_id" : "8003" }, "thanhtien" : 9100, "Số mặt hàng đặt" : 2 }
{ "_id" : { "_id" : "8002" }, "thanhtien" : 8000, "Số mặt hàng đặt" : 2 }
{ "_id" : { "_id" : "8004" }, "thanhtien" : 6900, "Số mặt hàng đặt" : 2 }
{ "_id" : { "_id" : "8001" }, "thanhtien" : 3900, "Số mặt hàng đặt" : 2 }
Ответ №1:
Вы можете использовать этот запрос:
- Сначала
$unwind
для доступа к каждому объекту вproducts
массив. - Затем объедините коллекции с помощью
$lookup
. - Получите первый элемент результата (сравнение по идентификаторам должно возвращать один документ, в противном случае вы можете использовать
$unwind
снова). - Добавьте поле, вызываемое
total
для получения общего значения. - И
$group
значения снова, чтобы получить желаемый результат.
db.Order.aggregate([
{
"$unwind": "$products"
},
{
"$lookup": {
"from": "Products",
"localField": "products.productId",
"foreignField": "_id",
"as": "result"
}
},
{
"$addFields": {
"result": {
"$arrayElemAt": ["$result", 0]
}
}
},
{
"$addFields": {
"total": {
"$multiply": ["$products.quantity", "$result.price"]
}
}
},
{
"$group": {
"_id": "$_id",
"thanhtien": {
"$sum": "$total"
},
"Số mặt hàng đặt": {
"$sum": 1
}
}
}
])
Пример здесь
Комментарии:
1. Спасибо за подробный отзыв, это полезно!