如何根据另一个字段更新 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 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配 MongoDB 中的子文档数组?

使用 Spring Data MongodB 更新嵌入式 mongodb 文档中的数组字段?

将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB

MongoDb:如何根据每个字段的值更新多个文档中的字段值?

MongoDb:如何根据每个字段的值更新多个文档中的字段值?

子数组中的 MongoDB 更新查询