database - 使用位置运算符更新 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 上运行查询,它也返回了相同的结果。是不是因为我的查询错误?
解决方案
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'}])
推荐阅读
- flutter - 同时在 iOS 和 Web 中运行 Flutter
- c# - 通过模态 WinForm (VSTO) 将线程返回给 Office
- python-3.x - 如何在多行上应用函数
- c++ - 指针值失去作用域
- django - Django 模型比较 2 模型和过滤器
- c# - Cosmos 上的 C# 关闭功能?
- reactjs - React - 如果条件超出 html 标记属性
- arrays - 在 Google Bigquery 中访问 ARRAY STRUCT 中的值
- bash - 使用“询问对话框”命令立即通过 Bash 命令传递文本
- css - 单击其他控件时JavaFX CheckBox会更改大小