首页 > 解决方案 > 基于 3 列合并两个集合

问题描述

我想加入两个名为Emp1的集合,工资基于dept,id 和 name。我想像在 pandas 合并中那样合并两者。

Emp1:
{"dept":"cs","id": 100,"name":"xxx","age": 20}
{"dept":"IT","id": 110,"name":"xxx","age": 21}
{"dept":"AI","id": 110,"name":"xxx","age": 21}   

萨尔:

{"dept":"cs","id": 100,"name":"xxx","sal": 200}
{"dept":"IT","id": 110,"name":"xxx","sal": 2100}
{"dept":"AI","id": 110,"name":"xxx","sal": 2100}   

输出应如下所示:

{"dept":"cs","id": 100,"name":"xxx","age": 20,"sal":200}
{"dept":"IT","id": 110,"name":"xxx","age": 21,"sal": 2100}
{"dept":"AI","id": 110,"name":"xxx","age": 21,"sal": 2100}    

基于 3 列加入的最佳解决方案是什么。我知道我们可以使用查找操作,但这里的情况是基于 3 列加入..

标签: mongodb

解决方案


您可以在查找中使用管道进行多个连接,如下所示:首先,您在 let 和管道 $match 中分配要匹配的键,您只能使用 $expr 来使用条件运算符,最后我们将 $lookup 结果与使用 $mergeObjects 运算符的 $$ROOT 文档。

db.emp.aggregate([
  {
    $lookup: {
      from: "sal",
      let: {
        dept: "$dept",
        id: "$id",
        name: "$name"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [
                    "$dept",
                    "$$dept"
                  ]
                },
                {
                  $eq: [
                    "$id",
                    "$$id"
                  ]
                },
                {
                  $eq: [
                    "$name",
                    "$$name"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "result"
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            $arrayElemAt: [
              "$result",
              0
            ]
          },
          {
            age: "$$ROOT.age"
          }
        ]
      }
    }
  }
])

推荐阅读