歌镇八荒 2023-02-21 00:40 采纳率: 100%
浏览 47
已结题

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

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

  • 写回答

6条回答 默认 最新

  • Monster-XH 2023-02-21 00:49
    关注

    基于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值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • 爱音斯坦牛 全栈领域优质创作者 2023-02-21 01:35
    关注

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

    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"]}})
    
    
    评论
  • 喊你敲代码 2023-02-21 07:01
    关注
    
    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)
    
    评论
  • 阳光宅男xxb 2023-02-21 07:20
    关注

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

    mydb.B.aggregate([
       {
         $lookup:
           {
             from: "A",
             localField: "username",
             foreignField: "username",
             as: "result_b"
           }
      },
    { $unwind : "$result_b" },
    {
          "$project":{  "id": "$result_b.id",  "name": 1  }
    }
    ])
    
    
    评论
  • 「已注销」 2023-02-21 08:42
    关注

    参考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存在重复值,代码需要做相应的调整。
    如果对您有帮助,请给与采纳,谢谢。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-22 03:32
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

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

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 已采纳回答 2月21日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 IDEA构建失败?怎么搞
  • ¥15 求该题的simpson,牛顿科特斯matlab代码,越快越好
  • ¥30 求解,有偿,可商量价格
  • ¥15 编译arm板子的gcc
  • ¥15 C++代码报错问题,c++20协程
  • ¥15 c++图Djikstra算法求最短路径
  • ¥15 Linux操作系统中的,管道通信问题
  • ¥15 ansible tower 卡住
  • ¥15 等间距平面螺旋天线方程式
  • ¥15 通过链接访问,显示514或不是私密连接