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

Update nested property by condition in 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 中有什么方法可以做到这一点吗?如果没有,我可以以某种方式 运行 native updateMany 查询吗?我只知道聚合 (Outer.objects.aggregate).

我发现这个不太干净(_get_collection不应该是public)解决方案:

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

更简洁的方法是使用 __raw__,这将允许在使用 mongo 引擎表时传递任何 mongo 条件 - 请在此处查看更多信息:https://docs.mongoengine.org/guide/querying.html#raw-queries