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

Posted

技术标签:

【中文标题】MongoDB 查找和展开没有给出正确的结果【英文标题】:MongoDB lookup and unwind not giving correct results 【发布时间】:2020-02-06 12:29:14 【问题描述】:

我有包含不同卖家所有产品列表的产品模型和包含订购产品列表的订单模型

我需要查询,获取卖家的总收入

产品型号:


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

【问题讨论】:

【参考方案1】:

首先,您使用 "SellerId" :1 进行过滤。这是不正确的。

其次,您需要展开 requests.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

【讨论】:

【参考方案2】:

$lookup 运算符产生一个数组字段,你需要在$group 管道之前$unwind 新字段才能得到想要的结果。 $unwind 解构数组字段。所以$unwind: "$requests.service" 请注意$requests.service 前面的美元符号($),然后您的小组将完成这项工作

【讨论】:

以上是关于MongoDB 查找和展开没有给出正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合查找和展开[重复]

使用 java 的 MongoDb $near 查询没有给出正确的位置

存储过程没有给出正确的值

MongoDB:使用 $geoWithin 运算符没有得到正确的结果

为啥使用堆栈的dfs没有给出正确的结果

OpenMP 没有给出正确的结果和不同的时间