MongoDB中如何基于另一嵌入文档的字段运算结果更新指定字段
MongoDB嵌入式数组字段运算更新方案
你原有代码存在两处需要修正的点:
$set配置的目标更新字段为test,因此只会更新test字段,需将目标字段改为statistic.crypt- 直接使用
$inventory.farm.$[].col会返回所有farm元素的col值组成的数组,无法精准提取id为12的farm对应的col值,需要搭配$filter做过滤提取
正确实现代码
self.collection.update_many( {"inventory.farm.id": 12}, [ { "$set": { "statistic.crypt": { "$toDouble": { "$sum": [ "$statistic.crypt", { "$multiply": [ # 过滤匹配id=12的farm,取col值,匹配失败默认返回0 {"$ifNull": [ {"$getField": { "field": "col", "input": {"$first": {"$filter": { "input": "$inventory.farm", "cond": {"$eq": ["$$this.id", 12]} }}} }, 0 ]}, 0.025 ] } ] } } } } ] )
逻辑说明
- 用
$filter遍历inventory.farm数组,筛选出id等于12的元素 - 用
$first取筛选结果的第一个匹配元素,搭配$getField提取该元素的col字段值,通过$ifNull兜底匹配失败的场景默认返回0 - 将提取到的col值乘以0.025得到增量值
- 把增量值和原有
statistic.crypt的值相加后,用$toDouble转换为双精度类型 - 最终将计算结果写入
statistic.crypt字段完成更新
内容的提问来源于stack exchange,提问作者Ice_One
相关产品推荐
相关产品推荐

