如何用一个公用的字段关联mongodb的两个集合?

现在已有两个collection,集合A中有id和name,集合B中有name,现在想要在集合b中按照集合A中对应的name,添加一个新字段id。该怎么做?

基于Monster 组和GPT的调写:
你可以使用MongoDB的聚合框架,具体操作如下:

将集合A和集合B连接,通过集合A中的name和集合B中的name进行匹配。使用$lookup操作符可以实现这一点。以下是一个例子,其中 "collection_a" 和 "collection_b" 分别是集合A和集合B的集合名称:

db.collection_b.aggregate([
  {
    $lookup:
      {
        from: "collection_a",
        localField: "name",
        foreignField: "name",
        as: "matching_docs"
      }
  }
])


2.对于每个匹配到的文档,将其name字段替换为对应的id字段。这可以使用$unwind和$project操作符完成。以下是一个例子:


db.collection_b.aggregate([
  {
    $lookup:
      {
        from: "collection_a",
        localField: "name",
        foreignField: "name",
        as: "matching_docs"
      }
  },
  { $unwind: "$matching_docs" },
  { $project: { _id: 0, "name": "$matching_docs.name", "id": "$matching_docs.id" } }
])

3.将结果插入到集合B中。这可以使用$merge操作符完成。以下是一个例子:



db.collection_b.aggregate([
  {
    $lookup:
      {
        from: "collection_a",
        localField: "name",
        foreignField: "name",
        as: "matching_docs"
      }
  },
  { $unwind: "$matching_docs" },
  { $project: { _id: 0, "name": "$matching_docs.name", "id": "$matching_docs.id" } },
  { $merge: { into: "collection_b" } }
])

这样,集合B中的每个文档都将有一个新的id字段,该字段的值是与集合A中匹配的文档的id值。

代码如下,有帮助的话采纳一下哦!

import pymongo

# 连接MongoDB数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 获取集合A和集合B
collection_a = client["your_database_name"]["collection_a"]
collection_b = client["your_database_name"]["collection_b"]

# 通过集合A中的name字段查找到对应的文档,并将id字段的值添加到集合B中的对应文档的新字段id中
for doc_a in collection_a.find():
    doc_b = collection_b.find_one({"name": doc_a["name"]})
    if doc_b:
        collection_b.update_one({"_id": doc_b["_id"]}, {"$set": {"id": doc_a["id"]}})


from pymongo import MongoClient
from pprint import pprint

# 连接 MongoDB
client = MongoClient('mongodb://localhost:27017/')

# 选择数据库和集合
db = client['testdb']
collection_a = db['collectionA']
collection_b = db['collectionB']

# 聚合查询
pipeline = [
    {
        '$lookup': {
            'from': 'collectionA',
            'localField': 'name',
            'foreignField': 'name',
            'as': 'joined_doc'
        }
    },
    {
        '$unwind': '$joined_doc'
    },
    {
        '$project': {
            '_id': 0,
            'name': 1,
            'id': {
                '$cond': {
                    'if': { '$gt': [{ '$size': '$joined_doc' }, 0] },
                    'then': '$joined_doc.id',
                    'else': { '$ifNull': [None, ""] }
                }
            }
        }
    }
]

# 执行聚合查询
result = collection_b.aggregate(pipeline)

# 输出结果
for doc in result:
    pprint(doc)

您好,要实现您的需求,将两个集合通过根据指定的字段连接起来的话,需要用到 $lookup方法,大致的代码样例如下,可根据您的需要进行调整:

mydb.B.aggregate([
   {
     $lookup:
       {
         from: "A",
         localField: "username",
         foreignField: "username",
         as: "result_b"
       }
  },
{ $unwind : "$result_b" },
{
      "$project":{  "id": "$result_b.id",  "name": 1  }
}
])

参考GPT和自己的思路,假设集合A的名称为"A",集合B的名称为"B",且它们都是MongoDB集合。在Python中,你可以使用pymongo模块连接MongoDB数据库,然后使用以下代码实现你的需求:

import pymongo

# 连接MongoDB数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["your_database_name"]

# 获取集合A和集合B
collection_A = db["A"]
collection_B = db["B"]

# 在集合B中查找与集合A中name相同的文档,并更新其id字段
for doc_A in collection_A.find():
    name = doc_A["name"]
    doc_B = collection_B.find_one({"name": name})
    if doc_B:
        # 集合B中存在相应文档,则更新其id字段
        collection_B.update_one({"_id": doc_B["_id"]}, {"$set": {"id": doc_A["id"]}})
    else:
        # 集合B中不存在相应文档,则插入新文档
        collection_B.insert_one({"name": name, "id": doc_A["id"]})

以上代码会遍历集合A中的所有文档,对于每个文档,查找集合B中与之对应的文档,如果找到,则更新其id字段;如果没找到,则插入一个新文档。请注意,这个过程中,我们假设集合A和集合B中name的值是唯一的,如果name存在重复值,代码需要做相应的调整。
如果对您有帮助,请给与采纳,谢谢。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^