Объединить 2 коллекции: заказ и продукты и сгруппировать по _id, общая сумма (количество * цена) Mongodb

#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. Спасибо за подробный отзыв, это полезно!