• MongoDB应用:forEach方法实际应用


    项目场景 

    今日的工作中有个需求是按照条件修改MongoDB集合中某个字段的值。之前都是用kettle或者代码处理;但是对于短频、偶尔的修改,上述方式实在是浪费时间。所以研究了下如何通过写MongoDB的 shell去实现。

    代码呈现

    在做语法说明之前,先将已完成的代码呈现。

    1. db.TEST.find({"NAME":"华为"}).forEach(function(doc){
    2. db.TEST.update({"_id":doc._id},{"$set":{"NAME":"小米"}},false,true)
    3. }
    4. )

    语法提炼 

    上文代码,其实挺简单的,就一个知识点:MongoDB的 forEach 方法;下面和大家分享下这个方法。

    该方法的标准语法如下

    <cursor>.forEach( function(resultset){...} )
    •  

    其中表示游标,即查询结果集,对应到MongoDB数据库中就是 db.collection.find()或者  db.collection.aggregate()的查询结果集;forEach方法会对游标进行遍历。如果您之前有接触过Oracle的PLSQL中的游标,那么这个概念对您来说就更好理解了。

    • function(resultset){...}

    function(resultset){...} 是对前面查询出的结果集数据的处理函数。我们可以根据实际的需求,决定该函数该如何写。其中的resultset可以自己定义写,表示的就是前面的结果集数据;如果您愿意,写个function(dog)都没关系。在花括号{}内,就是我们具体想做的操作了,可以打印(谁闲得无聊会打印呢)、删除、新增、更新等。

    下面再写几个例子让大家看的更清晰一些。

    打印

    1. db.TEST.find({"NAME":"华为"}).forEach(function(doc){
    2. printjson(doc);
    3. }
    4. )

    您前面的 db.TEST.find({"NAME":"华为"}) 查出来什么样的结果集,就打印出什么。

    删除

    1. db.TEST.find({"NAME":"华为"}).forEach(function(doc){
    2. db.TEST.remove(doc);
    3. }
    4. )

    方法总结

    今天处理的更新数据量是100万,其实还担心这个数据量会不会对数据库性能造成影响,甚至导致数据库崩溃。但和总监沟通后,总监说5000万数据量以下都可以用此方法。

    我自己也思考了下,因为是利用forEach方法遍历,每次更新一行,所以可以不用担心数据库崩溃问题。但一百多万的数据量,花了大几个小时才更新完,所以此方法在效率上可能还是存在不足。

  • 相关阅读:
    IntelliJ IDEA 2023.2 主要更新了什么?(图文版)
    ES6语法新特性(上)
    Python数据科学实战教程
    阿里云“玩转云上 StarRocks3.0 湖仓分析”,开启数据分析新范式
    解析Vue3源码(二)——ref
    H3C 存储换盘操作
    Dubbo的集群容错方案
    redis 持久化
    【HMS core】【FAQ】Account Kit、push Kit典型问题合集1
    2023年煤气证模拟考试题库及煤气理论考试试题
  • 原文地址:https://blog.csdn.net/m0_58872140/article/details/138161297