2015-06-19 1 views
3

Я хотел бы увеличить количество обновлений в mongoengine экземплярах документов, но, насколько я понял, model.objects.update(...) делает такое же обновление во всех документах, которые соответствуют критериям.Mongoengine массовое обновление без objects.update()

Пример:

entities = Foo.objects 

result = entities.update(
    set__foo='new bar', 
    upsert=True, 
    full_result=True) 

Это устанавливает свойство foo в new bar все документы, которые имеют свои foo равно bar. Я хотел бы сделать различные изменения на каждый документ.

Возможно ли это? Что-то вроде этого:

entities = Foo.objects 

... # make changes to each entity in entities 

entities = Foo.objects.update(entities) 
# these entities were bulk updated in mongodb. 

ответ

11

Просто вернуться сюда, в случае, если кто-то столкнулся с этим: mongoengine действительно не дает нам никакого способа насыпных различных обновлений для многих записей, но PyMongo делает! С его помощью, я мог бы легко написать обновление:

from pymongo import UpdateOne 
from mongoengine import Document, ValidationError 

class Foo(Document): 
    ... 

bulk_operations = [] 

for entity in entities: 
    try: 
     entity.validate() 
     bulk_operations.append(
      UpdateOne({'_id': entity.id}, {'$set': entity.to_mongo().to_dict()})) 

    except ValidationError: 
     pass 

if bulk_operations: 
    collection = Foo._get_collection() \ 
     .bulk_write(bulk_operations, ordered=False) 

Здесь я получаю коллекцию Foo с _get_collection() и выполнить список UpdateOne операций - обновления, так как они были построены.