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

Posted

技术标签:

【中文标题】将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB【英文标题】:Adding a field from an object in an array to another field of an object within the same array MongoDB 【发布时间】:2020-11-25 10:35:52 【问题描述】:

在更新 MongoDB 中的文档方面我非常需要帮助。

所以这是我的问题。我需要删除记录数组中类型为 OLD 的对象,但是在删除它之前,我需要将它的值添加到类型为 CURRENT 的对象中。所以给出下面的例子。查询应将 CURRENT 对象的值更改为 120,并且类型为 OLD 的对象将被删除;

我无法进行两次查询,因为此查询将更新数千条数据。

这是在 node.js 中使用猫鼬。

谢谢你!


    name: 'Test',
    records: [
        
            type: 'NEW',
            value: 50,
        ,
        
            type: 'OLD',
            value: 100,
        ,
        
            type: 'CURRENT',
            value: 20
         
    ]

【问题讨论】:

嗯,这有点像,但这实际上不是问题。我很容易从数组中拉出或删除对象。问题是我需要在删除它之前将它添加到数组中的另一个对象 【参考方案1】:

您可以使用 MongoDB v4.2 中的 update with aggregation pipeline 来完成,

第一个匹配类型为CURRENT 首先将$setCURRENT 类型和OLD 类型的值相加 第二个$set 删除类型OLD
db.collection.updateMany(
   "records.type": "CURRENT" ,
  [
    $set: 
      records: 
        $map: 
          input: "$records",
          as: "r",
          in: 
            $cond: 
              if:  $eq: ["$$r.type", "CURRENT"] ,
              then: 
                type: "$$r.type",
                value: 
                  $add: [
                    "$$r.value",
                    
                      $reduce: 
                        input: "$records",
                        initialValue: 0,
                        in: 
                          $cond: 
                            if:  $eq: ["$$this.type", "OLD" ] ,
                            then:  $add: ["$$this.value", "$$value"] ,
                            else: "$$value"
                          
                        
                      
                    
                  ]
                
              ,
              else: "$$r"
            
          
        
      
    
  ,
  
    $set: 
      records: 
        $filter: 
          input: "$records",
          as: "r",
          cond:  $ne: ["$$r.type", "OLD"] 
        
      
    
  
])

【讨论】:

以上是关于将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段

如何使用猫鼬复制字段数据并在同一文档的另一个字段中使用它?

如果其中一个字段存在于 mongoid 的另一个模型中,则获取对象数组

如果未找到值,则使用 mongoose 将对象添加到数组中,否则更新字段

将元素从一个对象添加/合并到数组内的另一个对象

ASP.NET MVC3 - 将项目动态添加到对象的数组中