обновляет документы в mongoengine, используя позиционный оператор, обновляет только первый элемент в массиве - PullRequest
0 голосов
/ 06 мая 2019

Я использую mongoengine и у меня есть коллекция Question.

class Question(Document):
    id = StringField(primary_key=True)
    answers = EmbeddedDocumentListField(Answer)

class Answer(EmbeddedDocument):
    id = StringField(primary_key=True)
    uid = StringField()
    answer = EmbeddedDocumentField(UserAnswer)

class UserAnswer(EmbeddedDocument):
    status = StringField()

Запрос на обновление документа ответа в поле ответов.

Question.objects(id="question_id", answers__uid="uid").update(set__answers__S__answer__status="new_status")

Только вышеупомянутый запрос обновляет толькопервый соответствующий документ в списке answers.

Как я могу обновить все соответствующие документы в списке?

ОБНОВЛЕНИЕ : я попытался выполнить запрос напрямуюна оболочке монго он также дал тот же результат.Это потому, что мой запрос неверен?

1 Ответ

0 голосов
/ 10 мая 2019

В mongoengine пока нет поддержки, но вы можете добиться этого, используя raw на update, см. Эту ветку: https://github.com/MongoEngine/mongoengine/issues/2019#issuecomment-473706068

UPDATE Вы должны использовать отфильтрованный позиционный оператор . В оболочке монго (требуется монго> = 3.6) мне удается заставить его работать с

c = db.question
c.update({}, {$set: {'answers.$[i].answer.status': 'new_status'}}, {multi: true, arrayFilters: [ {'i.answer.status': 'old_status'} ]})

Вы можете получить доступ к коллекции pymongo с помощью Question._get_collection(), синтаксис pymongo:

c.update_many({}, {'$set': {'answers.$[i].answer.status': 'new_status'}}, array_filters=[{'i.answer.status': 'old_status'}])
...