MongoDB поиск и раскрутка не дает правильных результатов - PullRequest
0 голосов
/ 09 октября 2019

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

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

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

{
  "_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

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Сначала вы фильтруете с "SellerId": 1. Это не правильно.

Во-вторых, вам нужно раскрутить запросы. Для агрегации $ 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

0 голосов
/ 09 октября 2019
Оператор

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

...