如何使用 PyMongo 有条件地从一个集合中复制字段并将它们添加到 MongoDB 中的另一个集合?

How to conditionally copy fields from one collection and add them to another in MongoDB with PyMongo?

我在 MongoDB 中有两个合集,分别是 collection_A 和 collection_B。

基本上,我想在给定集合 A 中的条件的情况下从集合 B 复制一个字段,但我不太确定如何通过 PyMongo 执行此操作。

集合模式:

collection_A

{
"ID": ObjectId(1234567),
"match": "yes"
}

collection_B

{
"B_ID": 1234567,
"add_field": "field_name"
}

在伪代码中,我的目标是:

if collection_A match = "yes":
    loop through records
    if collection_A ID = collection_B B_ID:
        add "add_field": "field_name" field to collection_A

我目前拥有的:

values = collection_A.find({"match": "yes})
for doc in values:
    TO-DO

关于如何通过 PyMongo 执行此操作,我已经四处查看了很多,但找不到太多。如果有人可以帮助我解决这个问题,或者指导我找到有用的链接,那将会很有帮助。谢谢

此示例将与 ID 匹配的所有必填字段从 B 复制到 A。评论解释了每个步骤。

for a_record in db.collection_A.find({'match': 'yes'}):  # Loop through collection A based on filter
    b_record = db.collection_B.find_one({'B_ID': a_record.get('ID')}, {'_id': 0, 'add_field': 1})  # Lookup corresponding record in Collection B
    if b_record is not None:  # B record will be None if no match
        db.collection_A.update_one({'_id': a_record['_id']}, {'$set': b_record})  # Update A with the value from B
    else:
        db.collection_A.update_one({'_id': a_record['_id']}, {'$set': {'add_field': None}})

使用数据的工作示例:

from pymongo import MongoClient

db = MongoClient()['mydatabase']
  
db.collection_A.insert_one({
    "ID": 1234567,
    "match": "yes"
})

db.collection_B.insert_one({
    "B_ID": 1234567,
    "add_field": "field_name"
})

for a_record in db.collection_A.find({'match': 'yes'}):  # Loop through collection A based on filter
    b_record = db.collection_B.find_one({'B_ID': a_record.get('ID')}, {'_id': 0, 'add_field': 1})  # Lookup corresponding record in Collection B
    if b_record is not None:  # B record will be None if no match
        db.collection_A.update_one({'_id': a_record['_id']}, {'$set': b_record})  # Update A with the value from B


print(list(db.collection_A.find({})))

打印:

[{'_id': ObjectId('5fc555172bc0555f17ccb918'), 'ID': 1234567, 'match': 'yes', 'add_field': 'field_name'}]