MongoDB 基础系列十三:mongo Shell 之 Javascript

前言

此篇博文是 Mongdb 基础系列之一;

本文为作者的原创作品,转载需注明出处;

简介

你可以在 mongo shell 中书写 javascript 代码来操控 MongoDB 的数据或者执行一些相关的管理操作;本章节主要是描述如何编写使用 mongo shell 的 javascript 脚本来访问 MongoDB;

建立新的连接

无论是通过 mongo shell 还是通过 JavasSript 文件,你都可以使用 Mongo() 方法来初始化 database connections 实例;像下面这样,(注意,下面所演示的用例在 javascript 或者是 mongo shell 中执行都是可以的)

1
2
3
new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)

通过 connection,便可以得到对应的 database instance,看下面这个例子,

1
2
conn = new Mongo();
db = conn.getDB("myDatabase");

上面这个例子中,我们通过 Mongo() 方法得到了一个数据库连接conn,然后通过该链接conn调用 getDB() 方法得到了一个 database 的 instance myDatabase;如果对 MongDB instance 设置了访问控制( Access Control ),那么就需要调用 db.auth() 方法来进行验证;

另外,你可以直接通过 connect() 方法来直接连接 MongoDB instance;

1
db = connect("localhost:27020/myDatabase");

上面这个例子连接了非默认端口的 MongoDB instance;

参考 mongo Shell Methods

Differences Between Interactive and Scripted mongo

通过 mongo shell 来写 javascript,需要考虑如下因素,

  • 虽然上面我们通过 getDB() 和 connect() 方法的到的 MongoDB instance 赋值给了变量 db,但是你也可以使用其它的变量来存储;
  • Write operations in the mongo shell use a write concern of { w: 1 } by default. If performing bulk operations, use the Bulk() methods. See Write Method Acknowledgements for more information.
  • 不能在 JavaScript 文件中使用任何的 shell helper ( 比如,use <dbname>, show dbs 等等 ),因为他们并不是有效的 JavaScript 方法;如果一定要在 JavaScript 中使用 shell helper 命令,可以使用相关的可替代的方法,
  • 在 mongo shell 的交互模式中( interactive mode ),mongo 将会自动的输出 cursors 的结果;在 JavaScripts 中使用 print() 或者 printjson() 的方法来输出;
    1
    2
    3
    4
    cursor = db.collection.find();
    while ( cursor.hasNext() ) {
    printjson( cursor.next() );
    }

Scripting

使用 mongo 指令来执行 JavaScript;

–eval option

1
2
3
4
5
$ mongo test --eval "printjson(db.getCollectionNames())"
MongoDB shell version v3.4.6
connecting to: mongodb://127.0.0.1:27017/test
MongoDB server version: 3.4.6
[ ]

上面这个例子会试图连接本地 27017 的 MongoDB instance test,并返回其所有的 collection names;

Execute a JavaScript File

可以为 mongo shell 指定一个 .js 文件,使得 mongo 可以直接执行该 JavaScript 文件;

1
$ mongo localhost:27017/test myjsfile.js

上述指令会为连接到 localhost:27017 的 MongoDB 实例 test 的 mongo shell 执行 myjsfile.js;上面的指令是显示的指明了 MongDB 的连接信息以及 MongoDB 实例信息,也可以通过下面这种方式,

1
$ mongo myjsfile.js

myjsfile.js 中通过使用 Mongo() 方法来通过建立新的连接的方式来达到同样的效果;

那么,如果已经进入 mongo shell 命令行,如何执行 JavaScript 文件呢?

1
> load("myjstest.js")

上述命令再回在 mongo shell 中执行 myjstest.js 文件;

load() 接收相对和绝对路径来引用 javascript 文件,比如当前 mongo shell 的执行路径是 /data/db,如果该文件夹下面有一个 myjstest.js 文件,那么我们可以使用下面两种方式任意一种来调用该 javascript 文件,

1
2
load("scripts/myjstest.js")
load("/data/db/scripts/myjstest.js")