在 MongoEngine 中按条件更新嵌套属性

问题描述

我使用以下 MongoEngine 文档描述了 MonogoDB 集合:

class Inner(EmbeddedDocument):
    value = StringField()

class Outer(Document):
    inner = EmbeddedDocumentListField(Inner)

所以 MongoDB 中的 db.outer 集合看起来像这样:

{ "inner": [{ "value": "A" },{ "value": "B" }] },{ "inner": [{ "value": "B" }] },{ "inner": [] }

现在,我想更新所有inner.value,其中旧值是“B”到“C”,所以想要的结果是:

{ "inner": [{ "value": "A" },{ "value": "C" }] },{ "inner": [{ "value": "C" }] },{ "inner": [] }

在原生 MongoDB 中,我可以使用这个查询:

db.outer.updateMany(
    {},{ "$set": { "inner.$[current].value": "C" }},{ "arrayFilters": [{ "current.value": "B" }]}
)

在 MongoEngine 中有没有办法做到这一点?如果不是,我可以以某种方式运行本机 updateMany 查询吗?我只知道聚合 (Outer.objects.aggregate)。

解决方法

我发现这不是很干净(_get_collection 不应该是公开的)解决方案:

Outer._get_collection().update_many(
   {},{"$set": {"inner.$[current].value": "C"}},array_filters=[{"current.value": "B"}]
)
,

一种更简洁的方法是使用 __raw__,它允许在使用 mongoengine 表时传递任何 mongo 条件 - 请在此处查看更多信息:https://www.vogella.com/tutorials/AndroidIntent/article.html#start-sub-activity-providing-some-data

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...