• 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方法遍历,每次更新一行,所以可以不用担心数据库崩溃问题。但一百多万的数据量,花了大几个小时才更新完,所以此方法在效率上可能还是存在不足。

  • 相关阅读:
    【Java SE】“方法”论 — 《方法的概念及使用》
    阿里企业邮箱域名解析MX记录表
    【AI视野·今日CV 计算机视觉论文速览 第255期】Wed, 27 Sep 2023
    C++ 求 最长连号
    数据结构与算法(一) 时间复杂度
    Linux入门之 init
    【Linux 06】项目自动化构建工具 make / makefile
    刷题心得 【2731. 移动机器人】
    【Spring系列】- Spring事务底层原理
    HTML脚本、字符实体、URL
  • 原文地址:https://blog.csdn.net/m0_58872140/article/details/138161297