在 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
我有以下 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