首页 > 解决方案 > 使用位置运算符更新 mongoengine 中的文档仅更新数组中的第一个元素

问题描述

我正在使用 mongoengine 并且我有一个 collection 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

如何让它更新列表中的所有匹配文档?

更新:我尝试直接在 mongo shell 上运行查询,它也返回了相同的结果。是不是因为我的查询错误?

标签: databasemongodbnosqlmongoengine

解决方案


mongoengine 中尚不支持它,但您可以通过使用raw on来实现它update,请参阅此线程:https ://github.com/MongoEngine/mongoengine/issues/2019#issuecomment-473706068

更新 您必须使用过滤的位置运算符。在 mongo shell(需要 mongo >=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'}])

推荐阅读