我有一个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
- 根据bulkWrite((语法,您的批量写入负载不正确
$addFields
是一个聚合管道阶段,你不能在常规更新查询中使用,所以为了解决这个问题,你可以从MongoDB 4.2开始使用聚合管道更新
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)
游乐场