如何使用节点 js 更新 mongo 文档中的数组元素?

Posted

技术标签:

【中文标题】如何使用节点 js 更新 mongo 文档中的数组元素?【英文标题】:How to update the element of an array in mongo document using node js? 【发布时间】:2021-09-15 10:49:08 【问题描述】:

这是我的 mongo 文档示例:

_id:ObjectId("60e54vfb99f346446618269")
count:Array
0:Object
   date:2021-07-03T15:13:42.200+00:00
   count:35
1:Object
   date:2021-07-03T15:13:42.200+00:34
   count:38

我正在使用节点来处理 api 请求。我想从 mongo 获取数组的最后一个元素并检查日期,如果日期是比现有日期新的日期,我想插入该数据。如果与现有的相同,我想更新现有日期对象中的计数。

如何在节点中做到这一点?我正在使用选择和切片,但我无法获取最后日期并进行比较。如何获取最后一个元素的日期并将其与请求的日期进行比较并发布到数据库?

这是我要发送的对象:

router.route("/update/").put((req, res) =>
    const count_update = 
        date: new Date(),
        count: req.body.count
    

【问题讨论】:

【参考方案1】:

您可以从 MongoDB 4.2 开始尝试update with aggregation pipeline,

$cond 检查最后一个元素的date 是否大于输入日期 $substr 获取前 10 个字符表示从完整日期开始的“yyyy-mm-dd” 是的, $concatArrays 与新的 datecount 字段对象连接当前的 count 数组 不, $map 迭代 count 数组的循环并检查条件,如果 date 与最后一个元素的日期匹配,然后更新 count 字段 $mergeObjects 将当前对象与更新的count 对象合并
var _id = "60e54vfb99f346446618269",
  date = new Date("2021-07-04T15:13:42.200+00:35"),
  count = 20;
var searchDate = date.toISOString().slice(0,10); // 2021-07-04

await SchemaModel.updateOne(
   _id: _id ,
  [
    $set: 
      count: 
        $cond: [
          
            $gt: [searchDate,  $substr: [ $last: "$count.date" , 0, 10] ]
          ,
          
            $concatArrays: [
              "$count",
              [ date: date, count: count ]
            ]
          ,
          
            $map: 
              input: "$count",
              in: 
                $mergeObjects: [
                  "$$this",
                  
                    $cond: [
                      
                        $eq: ["$$this.date",  $last: "$count.date" ]
                      ,
                       count: count ,
                      
                    ]
                  
                ]
              
            
          
        ]
      
    
  ]
)

Playground

【讨论】:

非常感谢您的帮助@turivishal。但问题是我想检查我的日期而不是时间。仅当日期不同时,我才想将新对象添加到数组中。如果是同一天的不同时间,我想更新现有对象。 我想检查我的日期而不是时间 => 好的,我会调查的。 只有当日期不同时,我才想在数组中添加一个新对象 =>这个查询也是这样做的,如果它不只是指出的话。 是的,你的答案是这样做的。但如果时间不同,它会插入新对象。我不想要那个。我只想在当月的日期发生变化时添加新对象。 在“2021-07-03T15:13:42.200+00:34”和“2021-07-03T15:13:42.200+00:35”的情况下,日期是否相同?但时间不同。如果同一天的时间不同,我不想添加新对象。我只想在不同的日子将新对象插入到数组中。 okay 集合中日期字段的数据类型是什么?是日期类型还是字符串类型?

以上是关于如何使用节点 js 更新 mongo 文档中的数组元素?的主要内容,如果未能解决你的问题,请参考以下文章

Mongo 文档中的更新数组不起作用

在 Mongo 集合中更新数组中的一条记录

在 mongo 和 upsert 中更新数组

如何使用 java 驱动程序更新 mongo db 中的文档字段?

如何将一个对象插入到mongo数组中的另一个对象中

如何更新nodejs中的mongo嵌套数组?