首页 > 解决方案 > 具有特定 Upsert 行为的 MongoDB UpdateOne

问题描述

这是我正在寻找的行为:

1-更新数据库,按唯一ID过滤,以防不存在创建新文档(所有字段)。

2- 如果文档存在,则仅更新一个特定字段。

我遇到的问题是,如果我使用:

collection.update_one( {'id':document['id']},
{"$set":{'field_to_update':document['field_to_update']}}, upsert:True)

每当文档不存在时,它将创建一个新文档,但仅以 field_to_update 作为其内容。而且我只需要更新一个字段(这是因为有些字段变化很大,我不想更新),但在另一种情况下创建一个完整的文档。

有谁如何做到这一点?

问候。

标签: mongodb

解决方案


当由于 upsert 插入新文档时,您可以使用$setOnInsert添加额外字段,如果没有,请尝试将其与 UpdateOne 一起使用,您可以使用如下示例的查询

 collection.findAndModify({
    'query': { 'id':document['id'] },
    'update': {
        "$set":{'field_to_update':document['field_to_update']},
        '$setOnInsert': {
            'field_to_add': document['field_to_add'],
            'field_to_add_more': document['field_to_add_more']
            }
        },
    'new': True,
    'upsert': True,
})

推荐阅读