首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于滤波器的阵列(py)mongo BulkUpdate单元

基于滤波器的阵列(py)mongo BulkUpdate单元
EN

Stack Overflow用户
提问于 2019-10-10 07:50:36
回答 1查看 183关注 0票数 1

我正在尝试为批量更新创建许多更新操作。

我试图通过array filter在数组中选择一个元素(字典),但是更新(或者更准确地说是重新插入)元素上的另一个字段(在下面的示例new_field中),而不是应用数组过滤器的字段。

所以简单地说:

在数组中,dictionaries

  • Select元素数组由
  • 在以前选择的元素

上由key_1

  • 向上插入key_2:value_2

我目前正在尝试用一个(测试)记录来实现这个目标。

(测试)记录如下所示:

代码语言:javascript
复制
{
  '_id': '001d1a70fdc77812053d',
  'images': {
    'photos': [{'id':'jxptm90a'}]
  },
  ...
}

更新操作如下所示:

代码语言:javascript
复制
update_operation = pymongo.UpdateOne(
    filter={'_id': '001d1a70fdc77812053d'},
    update={
        '$currentDate': {'oplog_skip': True},
        '$set': { "images.photos.$[new_field]": 2 },

    },
    upsert=False,
    array_filters=[ { 'id': 'jxptm90a' }]
)

但是,执行这样的命令:

代码语言:javascript
复制
  db.collection.bulk_write([update_operation])

结果出现以下错误:

代码语言:javascript
复制
{'writeErrors': [{'index': 0, 'code': 2, 'errmsg': "No array filter found for identifier 'test' in path 'images.photos.$[test]'", 'op': SON([('q', {'_id': '001d1a70fdc77812053d'}), ('u', {'$currentDate': {'oplog_skip': True}, '$set': {'images.photos.$[test]': 2}}), ('multi', False), ('upsert', False), ('arrayFilters', [{'id': 'jxptm90a'}])])}], 'writeConcernErrors': [], 'nInserted': 0, 'nUpserted': 0, 'nMatched': 0, 'nModified': 0, 'nRemoved': 0, 'upserted': []}
---------------------------------------------------------------------------
BulkWriteError                            Traceback (most recent call last)
<ipython-input-74-d31fe774222f> in <module>
      5 
      6     try:
----> 7         db.collection.bulk_write([update])
      8     except _pymongo.errors.BulkWriteError as bwe:
      9         print(bwe.details)

~/anaconda3/envs/py363/lib/python3.6/site-packages/pymongo/collection.py in bulk_write(self, requests, ordered, bypass_document_validation, session)
    495 
    496         write_concern = self._write_concern_for(session)
--> 497         bulk_api_result = blk.execute(write_concern, session)
    498         if bulk_api_result is not None:
    499             return BulkWriteResult(bulk_api_result, True)

~/anaconda3/envs/py363/lib/python3.6/site-packages/pymongo/bulk.py in execute(self, write_concern, session)
    511                 self.execute_no_results(sock_info, generator)
    512         else:
--> 513             return self.execute_command(generator, write_concern, session)
    514 
    515 

~/anaconda3/envs/py363/lib/python3.6/site-packages/pymongo/bulk.py in execute_command(self, generator, write_concern, session)
    339 
    340         if full_result["writeErrors"] or full_result["writeConcernErrors"]:
--> 341             _raise_bulk_write_error(full_result)
    342         return full_result
    343 

~/anaconda3/envs/py363/lib/python3.6/site-packages/pymongo/bulk.py in _raise_bulk_write_error(full_result)
    138         full_result["writeErrors"].sort(
    139             key=lambda error: error["index"])
--> 140     raise BulkWriteError(full_result)
    141 
    142 

BulkWriteError: batch op errors occurred
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 18:26:11

过滤器标识符必须与$set操作匹配;例如,类似于:

代码语言:javascript
复制
update_operation = pymongo.UpdateOne(
    filter={'_id': '001d1a70fdc77812053d'},
    update={
        '$currentDate': {'oplog_skip': True},
        '$set': { "images.photos.$[id]": 2 },
    },
    upsert=False,
    array_filters=[ { 'id': 'jxptm90a' }]
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58317949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档