Я создаю скрипт, использующий MongoEngine для обновления коллекции. Обновление должно изменить определенное поле в ListField.
Используя raw pyMongo, обновление будет выглядеть так:
db.books.update({"authors": {"$elemMatch": {"$eq": "matt"}}}, {'$set': {"authors.$": "Mathew"}}).
К сожалению, я должен сделать это в MongoEngine (так как остальная система работает с ним, и мне это нужно для согласованности), и поскольку это может быть очень большая коллекция, я предпочитаю, чтобы mongo обрабатывал обновление, а не загружал всю коллекцию и обновить каждый элемент книги в моем коде Python.
Я пытался сделать тот же запрос с Mongo Engine:
class Book(DynamicDocument):
meta = {'collection': 'books', 'strict': False}
authors = ListField()
@classmethod
def update_author_name(cls, oldVal, newVal):
filter = Q(**{"authors__in": [oldVal]})
cls.objects(filter).update(**{authors+".$": newVal})
однако я получаю исключение:
{InvalidQueryError}field names cannot contain dots (".") or null characters ("\0"), and they must not start with a dollar sign ("$").