我正在使用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上运行查询,它也返回了相同的结果。是因为我的查询错误吗?
答案 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'}])