在 MongoDB 中使用 $lookup

Using $lookup in MongoDB

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

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

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

其中 name 是采购集合中 customer 的名称,cost 是他购买的所有件商品的费用。

形式上,每件商品的成本定义为:

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

哪里 purchases.purchasedItems.i_name=sales.i_name

输出集合中的

cost是所有项目成本的总和。

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

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"}
])

对于我做错了什么以及正确的做法,我将不胜感激。

所以这里有几处不正确。

$lookup 阶段后缺少参考和 $unwind 的一堆。

尝试

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"}
])