Поиск и раскрутка MongoDB не дают правильных результатов

У меня есть модель продукта, которая содержит список всех продуктов разных продавцов, и модель заказа, которая содержит список заказанных продуктов.

Мне нужно сделать запрос, чтобы получить общую сумму, заработанную продавцом

Модель продуктов:

{
  "_id": 1,
  "ProductName": "product 1",
  "Price": 100,
  "SellerId": 1
},
{
  "_id": 2,
  "ProductName": "product 2",
  "Price": 200,
  "SellerId": 2
},
{
  "_id": 3,
  "ProductName": "product 3",
  "Price": 50,
  "SellerId": 1
}

Модель заказов:

{
  "_id": 1,
  "ProductId": 1,
  "Price": 100,
  "Quantity": 2,
  "Total": 200,
  "Status": true
},
{
  "_id": 2,
  "ProductId": 2,
  "Price": 200,
  "Quantity": 10,
  "Total": 2000,
  "Status": true
}

Агрегация

db.products.aggregate([
   {
     "$match": { "SellerId" :1 } 
   },
   { 
    $lookup: { 
      from: 'orders', 
      localField: '_id', 
      foreignField: 'ProductId', 
      as: 'requests.service'
    } 
  },
  $group:{
     _id: "$_id",
     totalAmount: { $sum: "$Total" },
  }
])

Окончательный вывод показывает 0 при поиске конкретного продавца, не в состоянии найти решение.

Ожидаемый результат для продавца 1 — 200, а для продавца 2 — 2000.


person MrNo One    schedule 09.10.2019    source источник


Ответы (2)


Во-первых, вы фильтруете с помощью «SellerId»: 1. Это неправильно.

Во-вторых, вам нужно раскрутить request.service. Для агрегации $unwind вы можете найти информацию здесь:

https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

Ваш запрос должен быть таким:

db.products.aggregate([
  {
    $lookup: {
      from: "orders",
      localField: "_id",
      foreignField: "ProductId",
      as: "requests.service"
    }
  },
  {
    $unwind: "$requests.service"
  },
  {
    $group: {
      _id: "$_id",
      totalAmount: {
        $sum: "$requests.service.Total"
      }
    }
  },
  {
    $sort: {
      "totalAmount": 1
    }
  }
])

https://mongoplayground.net/p/t4MfjgcyxXx

person SuleymanSah    schedule 09.10.2019

$lookup создает поле массива, вам нужно $unwind новое поле перед конвейером $group, чтобы получить желаемый результат. $unwind деконструирует поле массива. поэтому {$unwind: "$requests.service"} обратите внимание на знак доллара ($) перед $requests.service, прежде чем ваша группа начнет работу.

person Ani Emmanuel Arinzechukwu    schedule 09.10.2019