使用位置运算符更新mongoengine中的文档,仅更新数组中的第一个元素

时间:2019-05-06 15:11:35

标签: database mongodb nosql mongoengine

我正在使用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列表中的第一个匹配文档。

如何使其更新列表中所有匹配的文档?

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

1 个答案:

答案 0 :(得分:0)

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

更新 您必须使用filtered positional operator。 在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'} ]})

您可以使用Question._get_collection()访问pymongo集合,pymongo语法为:

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