为Mongo Shell编写脚本

本文将介绍怎样使用 JavaScript 为 mongo shell 编写脚本,这些脚本可以操作 MongoDB 中的数据或执行管理操作。

原文英文地址: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 等效项:

Shell Helpers

JavaScript Equivalents

show dbs, show databases

db.adminCommand('listDatabases')

use <db>

db = db.getSiblingDB('<db>')

show collections

db.getCollectionNames()

show users

db.getUsers()

show roles

db.getRoles({showBuiltinRoles: true})

show log <logname>

db.adminCommand({ 'getLog' : '<logname>' })

show logs

db.adminCommand({ 'getLog' : '*' })

it

cursor = db.collection.find()

if ( cursor.hasNext() ){

  cursor.next();

}

脚本编写

从系统提示符中,使用 mongo 来计算 JavaScript。

--eval 选项

在 mongo 中使用 --eval 选项向 mongo shell 传递一个 JavaScript 片段,如下所示:

mongo test --eval "printjson(db.getCollectionNames())"

这将使用连接到本地主机端口 27017 上的 mongo shell 返回 db.getCollectionNames() 的输出。

执行JavaScript文件

可以为 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"
}
我们常常听人说,人们因工作过度而垮下来,但是实际上十有八九是因为饱受担忧或焦虑的折磨。 —— 卢伯克.J.
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号