工作中碰到一个问题,需要把某个 collection 中的某些符合条件的数据取出来,逐行处理其中某些字段。mongodb 终端下支持直接写 js 代码、函数,也可以运行 js 文件。
1 首先需要设置 mongo 终端的代码编辑器,不设置的话只能输入一行代码文件,无法处理大段 js 逻辑
  进入 mongo 终端后,输入

f={}

  回车后,继续输入:

edit f

  未设置过相关系统变量的会收到如下提示:

please define EDITOR as a JavaScript string or as an environment variable

  我们可以输入以下语句,设置 EDITOR:

EDITOR="/usr/bin/vim"

  这样就临时设置了 vim 编辑器作为后续的 js 代码编辑器。此为临时方法,关闭mongo 后再次使用就必须再次设置。可以试着将 EDITOR="/usr/bin/vim" 加入到系统环境变量中,我暂时没尝试。。。

2 写 js 代码:设置好编辑器后,终端输入:

tempFunc = {}

  回车后继续输入:

edit tempFunc

  就会进入到刚刚设置的编辑器环境,我这里是 vim 环境。注意:vim 中输入的所有内容,会被替换成 “tempFunc = “ 中等号的右部分。所以如果不是只想编辑一行代码的话,最好是在 vim 中编辑成一个函数,确保替换后会变成 tempFunc = function(){…} 的形式。我在 vim 中编辑的完整内容如下:

  注意:

    一定要仔细检查语法,如果不小心打错了字,调用时候是没有效果的,也没有办法再次编辑,只能从头再编辑一遍!!!

  编辑好以后 wq 退出 vim,到此我们就完整定义了一个 tempFunc 函数。

  在终端中输入函数调用:
    tempFunc()

  mongo 会把 entities 表中所有 grade<2 的数据取出来,然后对 grade +1,再写回数据库。

  

 注:

  1:这里 update语句 写的有一个问题:原来的 grade 如果是 int32 类型,写入后会变成 double 类型。包括使用 inc、dec 之类的操作,都会把 int32 类型的数据覆写成 double 类型。用 NumberInt 函数就可以解决
  可以把 update 语句改成这样:
    db.entities.update({_id:rowData["_id"]}, {$set:{grade:NumberInt(newGrade)}}, {multi:false});

  2:尽量定义成一个函数体,方便外界整体调用。如果不想定义成一个函数,可以一开始的时候直接 输入 edit{}, 然后再 vim 中删掉默认保留的{},就可以写一行行的 js 代码了,最后退出 vim 的时候会压缩成一行代码,类似于这种,然后按回车就直接执行了:

var cursor = db.entities.find(); while(cursor.hasNext()){ var row = cursor.next(); print(row["grade"]); }

在 mongodb 终端环境下写多行 javascript 代码、函数的更多相关文章

  1. 使用Tmux提高linux终端环境下的效率

    最近转移到linux下开发,同事告诉我一个工具tmux.关于tmux的工具的使用参考以下文章 如何使用Tmux提高终端环境下的效率 tmux的使用和快捷键 tmux简明教程 tmux使用大全

  2. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  3. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  4. jdk1.8源码包下载并导入到开发环境下助推高质量代码(Eclipse、MyEclipse和Scala IDEA for Eclipse皆适用)(图文详解)

    不多说,直接上干货! jdk1.8 源码, Linux的同学可以用的上. 由于源码JDK是前版本的超集, 所以1.4, 1.5, 1.6, 1.7都可以用的上.     其实大家安装的jdk路径下,这 ...

  5. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏

    早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...

  6. 60行JavaScript代码俄罗斯方块

    教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏   早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下( ...

  7. 9 行 javascript 代码获取 QQ 群成员

    昨天看到一条微博:「22 行 JavaScript 代码实现 QQ 群成员提取器」. 本着好奇心点击进去,发现没有达到效果,一是 QQ 版本升级了,二是博客里面的代码也有些繁琐. 于是自己试着写了一个 ...

  8. 65行 JavaScript 代码实现 Flappy Bird 游戏

    飞扬的小鸟(Flappy Bird)无疑是2014年全世界最受关注的一款游戏.这款游戏是一位来自越南河内的独立游戏开发者阮哈东开发,形式简易但难度极高的休闲游戏,很容易让人上瘾. 这里给大家分享一篇这 ...

  9. 只要200行JavaScript代码,就能把特斯拉汽车带到您身边

    Jerry的前一篇文章 如何使用JavaScript开发AR(增强现实)移动应用 (一) 介绍了用React-Native + ViroReact开发增强现实应用的一些预备知识. 本文咱们开始进入增强 ...

随机推荐

  1. leetcode 66

    66. Plus One Given a non-negative number represented as an array of digits, plus one to the number. ...

  2. 对js闭包的粗浅理解

    只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(funct ...

  3. Android IOS WebRTC 音视频开发总结(六五)-- 给韩国电信巨头做咨询

    本文主要总结咨询过程中的一些问题,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam 韩国电信巨头sk想了解国内移动互联网rtc现状,所以上周请我过去给他们的相关人员 ...

  4. MVC5使用SignalR进行双向通信(1)

    MVC5使用SignalR进行双向通信 (1) 配置Signal 在NuGet中通过 install-package Microsoft.AspNet.SignalR 命令进行安装 在Scripts文 ...

  5. .NET Web开发总结

    在aspx文件中  创建控件 在右下角有控件信息 按类排序 会将控件信息安装类排序 点击控件 会增加属性页面的分页[事件]页面  可以增加其事件函数 字符串操作及其时间操作 fn_name.Inser ...

  6. 举例详解CSS中的的优先级

    计算优先级 优先级是根据由每种选择器类型构成的级联字串计算而成的.他是一个对应匹配表达式的权重. 如果优先级相同,靠后的 CSS 会应用到元素上. 注意:元素在文档树中的位置是不会影响优先级的优先级顺 ...

  7. linux中的audit审计日志

    这里首先介绍auditctl的应用,具体使用指南查看man auditctl.auditctl的man 描述说明这个工具主要是用来控制audit系统行为,获取audit系统状态,添加或者删除audit ...

  8. SQL如何查询对应的object

    SQL如何查询对应的Object   编写人:CC阿爸 2014-6-17 在日常SQL数据库的操作中,常常需要查询那些对象,如那些sp会包括对该表的操作,那些job会对应执行该sp等相关内容.总之是 ...

  9. Outlook 2007无法打开链接"由于本机的限制 该操作已被取消"

    编写人:CC阿爸 2014-2-17 近来在日常维护中,经常性的遇到用户在outlook中打开链接,提示[由于本机的限制,该操作已被取消],第一次的在网上搜索到解决办法后, 第二次再处理时,又没能记住 ...

  10. c语言学习的第四天2

    上图显示了float和double的精度,精度:就是指数值的精确程度,浮点类型可表示的数值范围很大,但只有几位是精确的,可以通过小 数所占的位数来获取,float小数部分最多能有7位有效数字,但绝对能 ...