首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用新对象更新记录

使用新对象更新记录
EN

Stack Overflow用户
提问于 2020-07-23 22:50:57
回答 1查看 61关注 0票数 0

假设我有以下MongoDB集合(我在本例中使用mongomock,因此很容易重现):

代码语言:javascript
复制
import mongomock

collection = mongomock.MongoClient().db.collection

objects = [{'name': 'Alice', 'age': 21}, {'name': 'Bob', 'age': 20}]
collection.insert_many(objects)

然后我想用一些新对象中的字段来更新我现有的对象:

代码语言:javascript
复制
new_objects = [{'name': 'Alice', 'height': 170}, {'name': 'Caroline', 'height': 160}]

我能想到的唯一方法是:

代码语言:javascript
复制
for record in new_objects:
    if collection.find_one({'name': record['name']}) is not None:
        collection.update_one({'name': record['name']}, {'$set': {'height': record['height']}})
    else:
        collection.insert_one(record)

但是,如果new_objects非常大,那么这个方法就会变得很慢--有没有办法使用update_many来解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 22:04:07

你不能使用update_many(),因为它需要一个单独的过滤器,但在你的用例中不会工作,因为每个过滤器都是不同的。

一个更简单的结构使用upsert=True来避免插入/更新逻辑,并且还设置了记录中指定的所有字段,这减少了代码:

代码语言:javascript
复制
for record in objects + new_objects:
    collection.update_one({'name': record.get('name')}, {'$set': record}, upsert=True)

如果更新次数过多,速度会变慢,请确保在name字段上有一个索引(在mongo shell中):

代码语言:javascript
复制
db.collection.createIndex( { "name": 1 } )

您可以通过使用bulk_write操作来获得更高的性能。工作示例:

代码语言:javascript
复制
from pymongo import MongoClient, UpdateOne

collection = MongoClient().db.collection

objects = [{'name': 'Alice', 'age': 21}, {'name': 'Bob', 'age': 20}]
new_objects = [{'name': 'Alice', 'height': 170}, {'name': 'Caroline', 'height': 160}]

updates = []

for record in objects + new_objects:
    updates.append(UpdateOne({'name': record.get('name')}, {'$set': record}, upsert=True))

collection.bulk_write(updates)

for record in collection.find({}, {'_id': 0}):
    print(record)

提供:

代码语言:javascript
复制
{'name': 'Alice', 'age': 21, 'height': 170}
{'name': 'Bob', 'age': 20}
{'name': 'Caroline', 'height': 160}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63057067

复制
相关文章

相似问题

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