原文英文地址:https://docs.mongodb.com/manual/tutorial/write-scripts-for-the-mongo-shell
您可以用 JavaScript 为 mongo shell 编写脚本,这些脚本可以操作 MongoDB 中的数据或执行管理操作。本教程介绍如何编写使用 mongo shell 访问 MongoDB 的 JavaScript。
在 mongo shell 或 JavaScript 文件中,您可以使用 mongo() 构造函数实例化数据库连接:
new Mongo() new Mongo(<host>) new Mongo(<host:port>)
考虑以下示例,该示例实例化到默认端口 localhost 上运行的 MongoDB 实例的新连接,并使用 getDB() 方法将全局 db 变量设置为 myDatabase:
conn = new Mongo(); db = conn.getDB("myDatabase");
如果连接到强制访问控制的 MongoDB 实例,则可以使用 db.auth() 方法进行身份验证。
此外,还可以使用 connect() 方法连接到 MongoDB 实例。下面的示例连接到使用非默认端口 27020 在 localhost 上运行的 MongoDB 实例,并设置全局 db 变量:
db = connect("localhost:27020/myDatabase");
注意:从 4.2 版开始,mongo shell 提供了 isInteractive() 方法,该方法返回一个布尔值,指示 mongo shell 是以交互式模式运行还是以脚本模式运行。
在为 mongo shell 编写脚本时,请考虑以下几点:
若要设置 db 全局变量,请使用 getDB() 方法或 connect() 方法。可以将数据库引用分配给 db 以外的变量。如下:
conn = new Mongo("localhost:27017"); db = conn.getDB("test"); // 同下 db = connect("localhost:27017/test");
mongo shell 中的写操作默认使用 {w:1} 的写关注点。如果执行批量操作,请使用 Bulk() 方法。
不能使用任何 shell 助手 (例如,use <dbname>, show dbs 等) 在 JavaScript 文件中,因为它们不是有效的 JavaScript。
在交互模式下,mongo 打印操作结果,包括所有游标的内容。在脚本中,要么使用 JavaScript print() 函数,要么使用 mongo 特定的 printjson() 函数返回格式化的 JSON。示例:要在 mongo shell 脚本中打印结果光标中的所有项,请使用以下语句:
cursor = db.collection.find(); while ( cursor.hasNext() ) { printjson( cursor.next() ); }
下表将最常见的 mongo shell 帮助器映射到它们的 JavaScript 等效项:
从系统提示符中,使用 mongo 来计算 JavaScript。
在 mongo 中使用 --eval 选项向 mongo shell 传递一个 JavaScript 片段,如下所示:
mongo test --eval "printjson(db.getCollectionNames())"
这将使用连接到本地主机端口 27017 上的 mongo shell 返回 db.getCollectionNames() 的输出。
可以为 mongo shell 指定一个 .js 文件,mongo 将直接执行 JavaScript。考虑以下示例
mongo localhost:27017/test myjsfile.js
此操作在 mongo shell 中执行 myjsfile.js 脚本,mongo 连接到本地主机端口 27017 上的 mongod 实例的 test 数据库。
或者,您可以使用 mongo() 构造函数在 javascript 文件中指定 MongoDB 连接参数。
可以在 mongo shell 中使用 load() 函数执行 .js 文件,如下所示:
load("myjstest.js")
这个函数加载并执行myjstest.js文件。
load()方法接受相对路径和绝对路径。如果 mongo shell 的当前工作目录是 /data/db,而 myjstest.js 驻留在 /data/db/script 目录中,那么 mongo shell 中的以下调用将是等效的:
load("scripts/myjstest.js") load("/data/db/scripts/myjstest.js")
注意:load() 函数没有搜索路径。如果所需脚本不在当前工作目录或完整指定路径,则 mongo 将无法访问该文件。
实例1:编写一个简单的脚本,连接到本地 MongoDB 服务。然后,查询 test 集合的所有数据,使用 while 循环输出。
// 将该脚本保存到 demo1.js 文件,并且复制到 mongodb 的 bin 目录 // 连接到本地 MongoDB conn = new Mongo("localhost:27017"); // 选择数据库 test db = conn.getDB("test"); // 查询 test 集合数据 cursor = db.test.find(); // 迭代数据,并且输出到控制台 while ( cursor.hasNext() ) { printjson( cursor.next() ); }
使用“mongo demo1.js”命令直行 JavaScript 脚本。如下:
D:mongodb-v4.0.2-x86in> mongo.exe demo1.js MongoDB shell version v4.0.2-143-g7ea530946f connecting to: mongodb://127.0.0.1:27017 Implicit session: session { "id" : UUID("91e5be4e-a04e-44f7-b928-d7b0d883dc0f") } MongoDB server version: 4.0.2-143-g7ea530946f { "_id" : ObjectId("5e634d3f53aed440745ed800"), "name" : "张三", "age" : 27, "sex" : "男", "email" : "zhangs@outlook.com" } { "_id" : ObjectId("5e634d4f53aed440745ed801"), "name" : "李四", "age" : 24, "sex" : "男", "email" : "li@outlook.com" } { "_id" : ObjectId("5e634d6053aed440745ed802"), "name" : "王五", "age" : 28, "sex" : "男", "email" : "ww@outlook.com" }
实例2:分别使用 getDB() 和 connect() 方法连接到 MongoDB。如下:
// 方式一 conn = new Mongo("localhost:27017"); db1 = conn.getDB("test"); showData(db1.test.find()); // 方式二 db2 = connect("localhost:27017/test"); showData(db2.test.find()); function showData(cursor) { while ( cursor.hasNext() ) { printjson( cursor.next() ); } }
使用“mongo demo2.js”命令直行 JavaScript 脚本。如下:
D:mongodb-v4.0.2-x86in> mongo demo2.js MongoDB shell version v4.0.2-143-g7ea530946f connecting to: mongodb://127.0.0.1:27017 Implicit session: session { "id" : UUID("c40398f1-4aee-496d-b4b2-5661402d5d19") } MongoDB server version: 4.0.2-143-g7ea530946f { "_id" : ObjectId("5e634d3f53aed440745ed800"), "name" : "张三", "age" : 27, "sex" : "男", "email" : "zhangs@outlook.com" } { "_id" : ObjectId("5e634d4f53aed440745ed801"), "name" : "李四", "age" : 24, "sex" : "男", "email" : "li@outlook.com" } { "_id" : ObjectId("5e634d6053aed440745ed802"), "name" : "王五", "age" : 28, "sex" : "男", "email" : "ww@outlook.com" } connecting to: mongodb://localhost:27017/test Implicit session: session { "id" : UUID("7c550e6c-d8dc-49d8-b3a8-75be49aca52d") } MongoDB server version: 4.0.2-143-g7ea530946f { "_id" : ObjectId("5e634d3f53aed440745ed800"), "name" : "张三", "age" : 27, "sex" : "男", "email" : "zhangs@outlook.com" } { "_id" : ObjectId("5e634d4f53aed440745ed801"), "name" : "李四", "age" : 24, "sex" : "男", "email" : "li@outlook.com" } { "_id" : ObjectId("5e634d6053aed440745ed802"), "name" : "王五", "age" : 28, "sex" : "男", "email" : "ww@outlook.com" }