Python Mongo通过将一个字段中的值映射到另一个集合中的字段中的值来创建新字段

Python Mongo通过将一个字段中的值映射到另一个集合中的字段中的值来创建新字段,python,mongodb,mongodb-query,aggregation-framework,pymongo,Python,Mongodb,Mongodb Query,Aggregation Framework,Pymongo,我有一个值为{'Race':'blck'}的集合c1,我想使用另一个具有字段{'raw':'blck','mapped_Race':'black'}的集合c2,用一个新字段更新c1中的文档,如{'Race_':'black'}。这将通过在原始值上将c1中的Race值与c2中的文档进行匹配来实现 更新将使c1文档具有字段{'Race':'blck','Race\u standarized':black'} 如何在聚合管道中执行此操作?(我在PyMongo工作。)因为Mongo是一个nosql数据库

我有一个值为
{'Race':'blck'}
的集合c1,我想使用另一个具有字段
{'raw':'blck','mapped_Race':'black'}
的集合c2,用一个新字段更新c1中的文档,如
{'Race_':'black'}
。这将通过在原始值上将c1中的Race值与c2中的文档进行匹配来实现

更新将使c1文档具有字段
{'Race':'blck','Race\u standarized':black'}


如何在聚合管道中执行此操作?(我在PyMongo工作。)

因为Mongo是一个nosql数据库,所以没有关系数据库中的连接。但是,聚合管道中的$lookup特性克服了这一问题。我还没有在pymongo框架中尝试这个方法,但是在mongo中,您必须使用$lookup、$unwind和$out的组合来更新字段。$lookup类似于SQL world中的遗漏连接,它返回一个数组-我们必须使用$unwind来获取特定字段,然后使用$out来更新或写入新集合。我发现这个链接很有用[https://developer.mongodb.com/community/forums/t/update-a-collection-field-based-on-another-collection/4875]

这应该可以做到:

db.c1.aggregate([
    {
        $lookup: {
            from: "c2",
            localField: "Race",
            foreignField: "raw",
            as: "Race_Standardized"
        }
    },
    {
        $set: {
            Race_Standardized: {
                $first: "$Race_Standardized.mapped_race"
            }
        }
    },
    {
        $out: "c1"
    }
])

但请记住,$out阶段将覆盖c1集合。

在客户端查询c2集合并迭代文档以构建c1的大容量写入操作可能更有效:

updates = []
for doc in db.c2.find({}):
   updates.append(pymongo.UpdateMany({'Race':doc.get('raw')},{'$set':{'Race_Standardized':doc.get('mapped_race')}}))
result = db.c1.bulk_write(updates)

使用聚合管道是不可能的,它需要从c2中查找和在c1中更新两个单独的查询。如果您使用MongoDB 4.2+使用
$merge
而不是
$out