Mongodb批量过滤并添加连接字段
Posted
技术标签:
【中文标题】Mongodb批量过滤并添加连接字段【英文标题】:Mongo bulk filter and add concatenated field 【发布时间】:2021-08-03 22:14:22 【问题描述】:我有一个正在尝试更新的 Mongo 集合(在 PyMongo 中)。我有像'state': 'ny', 'city': 'nyc', 'race': 'b', 'ethnicity': 'h'
这样的文档,我正在尝试通过匹配某些条件对这些文档进行批量操作,并创建了一个连接的“race_ethnicity”字段。
一个伪例子可能是:
filter =
'state': 'ny',
'city': 'nyc',
'race': "$exists": True,
'ethnicity': "$exists": True,
'race_ethnicity': "$exists": False
action = '$addFields': 'race_ethnicity': '$concat': ['$race', '$ethnicity']))
使用上述文档,更新后的文档为:'state': 'ny', 'city': 'nyc', 'race': 'b', 'ethnicity': 'h', 'race_ethnicity': 'bh'
。
我想批量匹配,并批量更新这样的集合 — 我如何在不出现 BulkWriteError 的情况下进行此操作?
*** 我试过的:
updates = []
updates.append(UpdateMany(
'state': 'ny',
'city': 'nyc',
"race": "$exists": True,
"ethnicity": "$exists": True,
"race_ethnicity": "$exists": False
,
'$addFields': 'race_ethnicity': '$concat': ['$race', '$ethnicity']))
self.db.bulk_write(updates)
这产生了以下错误:
pymongo.errors.BulkWriteError: batch op errors occurred
【问题讨论】:
【参考方案1】: 根据bulkWrite() syntax,您的批量写入负载不正确,$addFields
是一个聚合管道阶段,您不能在常规更新查询中使用,因此要解决此问题,您可以从 MongoDB 4.2 开始使用 update with aggregation pipeline,
updates = []
updates.append(
'updateMany':
'filter':
'state': 'ny',
'city': 'nyc',
'race': '$exists': True,
'ethnicity': '$exists': True,
'race_ethnicity': '$exists': False
,
'update': [
'$set': 'race_ethnicity': '$concat': ['$race', '$ethnicity']
]
)
self.db.bulk_write(updates)
Playground
【讨论】:
以上是关于Mongodb批量过滤并添加连接字段的主要内容,如果未能解决你的问题,请参考以下文章