如何根据另一个字段更新 mongodb 中的数组 dict 元素
Posted
技术标签:
【中文标题】如何根据另一个字段更新 mongodb 中的数组 dict 元素【英文标题】:How to Update Array dict Elements in mongodb based on another field 【发布时间】:2021-10-31 21:37:40 【问题描述】:如何根据将函数应用于另一个字段(位于不同的嵌入文档中)来更新文档中的值?
有了下面的示例数据,我想
-
为具有
id
12 的农场获取col
字段
乘以 0.025
添加statistic.crypt
字段的当前值
通过使用$toDouble
转换来确保值是双精度值
将结果存回statistic.crypt
数据:
"_id":
"$oid": "6128c238c144326c57444227"
,
"statistic":
"balance": 112570,
"diamond": 14,
"exp": 862.5,
"lvl": 76,
"mn_exp": 2.5,
"lvl_mn_exp": 15,
"coll_ms": 8047,
"all_exp": 67057.8,
"rating": 0,
"crypt": 0
,
"inventory":
"farm": [
"id": 12,
"col": 100,
"currency": "diamond",
"cost": 2,
"date": "2021-09-02 18:58:39"
,
"id": 14,
"col": 1,
"currency": "diamond",
"cost": 2,
"date": "2021-09-02 16:57:08"
],
"items": []
,
...
我最初的尝试是:
self.collection
.update_many("inventory.farm.id": 12, [
"$set":
"test":
'$toDouble':
"$sum": [
'$multiply':["$inventory.farm.$[].col", 0.025],
'$test'
]
,])
这不起作用,因为它适用于test
而不是statistic.crypt
,我不知道如何修改它以适用于statistic.crypt
。
【问题讨论】:
提供的样本数据 @mohammad Naimi 我添加了 【参考方案1】:一个字段可以在以下阶段基于另一个字段更新:
-
添加包含农场的字段
将
statistic.crypt
设置为数学表达式的结果(应用于新嵌入的场)
删除多余的字段
在代码中:
self.collection.update_many("inventory.farm.id": 12 , [
$addFields:
hh:
$filter:
input: "$inventory.farm",
as: "z",
cond: $eq: ["$$z.id", 12] ,
,
,
,
,
$set:
"statistic.crypt":
$toDouble:
$sum: [
$multiply: [ $first: "$hh.col" , 0.025],
,
"statistic.crypt",
],
,
,
,
,
$project:
id_pr: 1,
id_server: 1,
role: 1,
warns: 1,
id_clan: 1,
statistic: 1,
design: 1,
date: 1,
inventory: 1,
voice: 1,
,
,)
【讨论】:
我怎样才能代替“$first”,即第一个元素,准确地引用数组文档的“id”键 所以你想更新特定的农场数组? 是的,没错,很抱歉我的不准确 我试过了。 ?但是有一个新问题,我在问题中描述了它 "$inventory.crypt" 库存没有加密字段以上是关于如何根据另一个字段更新 mongodb 中的数组 dict 元素的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?
将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB
MongoDb:如何根据每个字段的值更新多个文档中的字段值?