MongoDB查找和展开未给出正确的结果

时间:2019-10-09 08:00:37

标签: node.js mongodb mongoose mongodb-query mongodb-atlas

我有“产品”模型,其中包含不同卖方的所有产品的列表;“订单”模型,其中包含订购的产品的列表

我需要进行查询,以获取卖方赚取的总金额

产品型号:

{
  "_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 个答案:

答案 0 :(得分:1)

首先,您要使用“ 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

答案 1 :(得分:0)

$lookup运算符产生一个数组字段,您需要在$unwind管道之前$group个新字段来获得所需的结果。 $unwind解构数组字段。因此,{$unwind: "$requests.service"}请注意($)前面的美元符号$requests.service,然后再进行分组