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批量过滤并添加连接字段的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB 3.2中的唯一索引忽略空值

MongoDB批量操作时字段为null时不会入库

在 mongodb 中执行重复过滤

使用多个字段在 MongoDB 聚合框架中按相关性排序

使用多个字段在 MongoDB 聚合框架中按相关性排序

mongodb聚合两个集合并添加新字段