问题描述
我使用以下 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