如何使用 aggregate & $lookup 合并 2 个集合与 mongodb 中的特定字段

How to merge 2 collections with specific fields in mongodb, with aggregate & $lookup

我在使用聚合和 $lookup 时遇到问题。因此,感谢您的及时帮助。

比方说,我有这 2 个集合,在同一个 mongoDB:

// collection1 (2 records, in this example):
{
  name: 'name1',
  city: 'city1'
}

{
  name: 'name2’,
  city: 'city2’
}

// collection2 (3 records, in this example):
{
  name: 'name1',
  education: ‘college’,
  occupation: ’engineer’,
  address: 'address1'
}

{
  name: 'name2’,
  education: ‘highschool’,
  occupation: ’manager’,
  address: 'address2'
}

{
  name: 'name3’,
  education: ‘highschool’,
  occupation: ’manager’,
  address: 'address3'
}

我想要一个最终的集合,final_collection,像这样返回(名称字段用作索引):

{
  name: 'name1',
  city: 'city1'
  education: ‘college’,
  occupation: ’engineer’
}

{
  name: 'name2’,
  city: 'city2’
  education: ‘highschool’,
  occupation: ’manager’
}

本质上,仅将 'education' 和 'occupation' 字段添加到 collection1 中,用于匹配的记录(name1 和 name2)。

你能帮忙吗?非常感谢!

你可以 $lookup 加入两个合集

  • $lookup加入两个集合
  • $addFields 添加新字段
  • $arrayElementAt 获取连接后的第一个元素。 $ifNull 防止数组中没有元素时出现 NPE

这是代码

db.collection2.aggregate([
  {
    "$lookup": {
      "from": "collection1",
      "localField": "name",
      "foreignField": "name",
      "as": "join"
    }
  },
  {
    $addFields: {
      join: {
        $ifNull: [
          { "$arrayElemAt": [ "$join", 0 ] },
          []
        ]
      }
    }
  },
  {
    "$addFields": {
      "city": "$join.city",
      join: "$$REMOVE",
      address: "$$REMOVE"
    }
  }
])

工作Mongo playground