在MongoDB中使用$ lookup

时间:2018-01-27 17:45:42

标签: mongodb mongodb-3.6

我在 mydb 数据库中有以下集合:

  • 购买:它包含以下格式的文档:

    {
     _id: <ObjectId>,
     name: <String>, //customer name
     purchasedItems: <Array>
              0: < Object >
                  i_name: <String> // item name
                  qntity: <Int>
              // other objects in the array
    }
    
  • 销售:它包含以下格式的文档:

    {
     _id: <ObjectId>,
     i_name: <String>,
     qntity: <Int>
     cost: <Int>
    }
    

我想输出一个包含以下文件的新集合:

    {
     _id: <ObjectId>,
     name: <String>,
     cost: <Int>
    }

名称是购买集合中客户的名称,费用所有的费用他购买的物品。

正式地,每个项目的成本定义为:

  

purchases.purchasedItems.qntity / sales.qntity)* sales.cost

在哪里购买.purchasedItems.i_name = sales.i_name

输出集合中的

成本是所有项目的总和&#39;成本。

我已经尝试了以下但是它不起作用:

db.purchases.aggregate([
    {$unwind: "$purchasedItems"},
    {$lookup:
        {from:"sales",
        localField:"purchasedItems.i_name",
        foreignField:"i_name",
        as: "n_cost"}
    },
    {
        $group:{
               _id: "$_id",
               name: "$name",
               cost: {$sum: {multiply:[{$divide:["$n_cost.qntity","$qntity"]},"$n_cost.cost"]}}
        }
    },
    {$out: "results"}
])

我很欣赏任何帮助,说明我做错了什么,以及正确的做法是什么。

1 个答案:

答案 0 :(得分:1)

所以这里有一些不正确的事情。

$unwind阶段之后缺少参考文献并遗失$lookup

尝试

db.purchases.aggregate([
  {"$unwind":"$purchasedItems"},
  {"$lookup":{
    "from":"sales",
    "localField":"purchasedItems.i_name",
    "foreignField":"i_name","as":"n_cost"
  }},
  {"$unwind":"$n_cost"},
  {"$group":{
    "_id":"$_id",
    "name":{"$first":"$name"},
    "cost":{
      "$sum":{
        "$multiply":[
          {"$divide":["$purchasedItems.qntity","$n_cost.qntity"]},
          "$n_cost.cost"
        ]
      }
    }
  }},
  {"$out":"results"}
])

没有$unwind

db.purchases.aggregate([
  {"$lookup":{
    "from":"sales",
    "localField":"purchasedItems.i_name",
    "foreignField":"i_name",
    "as":"n_cost"
  }},
  {"$project":{
    "name":1,
    "cost":{
      "$sum":{
        "$map":{
          "input":{"$range":[0,{"$size":"$purchasedItems"}]},
          "as":"ix",
          "in":{
            "$let":{
              "vars":{
                "purchase":{"$arrayElemAt":["$purchasedItems","$$ix"]},
                "sales":{"$arrayElemAt":["$n_cost","$$ix"]}},
                "in":{
                  "$multiply":[
                    {"$divide":["$$purchase.qntity","$$sales.qntity"]},"$$sales.cost"
                  ]
                }
            }
          }
        }
      }
    }
  }},
  {"$out":"results"}
])