编写mongo Shell的脚本
翻译&补充:官方文档——Write Scripts for the mongo Shell
在此页面上
- 打开新连接
- 互动和脚本之间的区别
- 脚本
您可以在JavaScript中编写mongo shell
的脚本,在MongoDB中操作数据或执行管理操作。 有关mongo shell
的更多信息,有关使用这些mongo
脚本的更多信息,请参阅通过服务器部分上的mongo shell
实例运行.js
文件。
这里提供了编写使用mongo shell
访问MongoDB的JavaScript的介绍。
在脚本文件中,可包含任意数量使用JavaScript(如条件语句和循环)的MongoDB命令。MongoDB shell脚本编程主要是通过三种方式实现的。
- 在命令行指定要执行的JavaScript文件。
- 在命令行使用参数--eval
,其中expression是要执行的JavaScript表达式。 - 在MongoDB shell启动后,调用方法load(script_path),其中script_path是要执行的JavaScript文件的路径。
打开新连接
从mongo shell或从JavaScript文件,您可以使用Mongo()构造函数实例化数据库连接:
new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)
考虑下面的例子,它实例化一个到默认端口上在localhost上运行的MongoDB实例的新连接,并使用getDB()方法将全局数据库变量设置为myDatabase:
conn = new Mongo();
db = conn.getDB("myDatabase");
如果连接到强制实施访问控制的MongoDB实例,则可以使用db.auth()方法进行身份验证。
此外,您可以使用connect()方法连接到MongoDB实例。 以下示例连接到在localhost上运行的非默认端口27020的MongoDB实例,并设置全局数据库变量:
db = connect("localhost:27020/myDatabase");
方法请参考这里:mongo Shell Methods
互动和脚本之间的区别(Differences Between Interactive and Scripted mongo)
当为mongo shell编写脚本时,请考虑以下内容:
-
要设置db全局变量,请使用
getDB()
方法或connect()方法。 您可以将数据库引用分配给除db以外的变量。 -
默认情况下,
mongo shell
中的写操作使用{w:1}
的写入关注。 如果执行批量操作,请使用 Bulk()方法。 有关详细信息,请参阅 Write Method Acknowledgements 。更改在版本2.6:在MongoDB 2.6之前,调用
db.getLastError()
显式地等待写操作的结果。 -
您不能在JavaScript文件内使用任何shell帮助程序(例如使用
<dbname>
,show dbs
等),因为它们不是有效的JavaScript。
下表将最常见的mongo shell
帮助器映射到他们的JavaScript等效项。
Shell Helpers | JavaScript Equivalents |
---|---|
show dbs, show databases | db.adminCommand('listDatabases') |
use |
db = db.getSiblingDB(' |
show collections | db.getCollectionNames() |
show users | db.getUsers() |
show roles | db.getRoles({showBuiltinRoles: true}) |
show log |
db.adminCommand({ 'getLog' : ' |
show logs | db.adminCommand({ 'getLog' : '*' }) |
it | cursor = db.collection.find() ... |
- 在交互模式下,mongo打印操作的结果,包括所有光标的内容。 在脚本中,使用JavaScript
print()
函数或mongo特定的printjson()
函数返回格式化的JSON。
例
要在mongo shell脚本中打印结果游标中的所有项目,请使用以下idiom:
cursor = db.collection.find();
while ( cursor.hasNext() ) {
printjson( cursor.next() );
}
find()拿到的不是数据,而是游标(cursor),详情看mongo Shell Methods中关于cursor
脚本
从系统提示符,使用mongodb来评估JavaScript。
-eval 参数
使用--eval
选项为mongo传递shell一个JavaScript fragment
,如下所示:
mongo test --eval "printjson(db.getCollectionNames())"
执行JavaScript文件
您可以为mongo shell指定.js文件,mongo将直接执行JavaScript:
mongo localhost:27017/test myjsfile.js
此操作在mongo shell中执行myjsfile.js
脚本,该脚本连接到可以通过端口27017
上的localhost
接口访问的mongod实例上的 test 数据库。
或者,您可以使用Mongo()构造函数在javascript文件中指定mongodb连接参数。 有关详细信息,请参阅文章开头打开新连接部分。
您可以使用load()
函数从mongo shell中执行.js文件,如下所示:
▶ mongo
MongoDB shell version v3.4.0-rc4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0-rc4
...
>load("myjstest.js")
此函数加载并执行myjstest.js文件。
load()方法接受相对路径和绝对路径。如果mongo shell的当前工作目录是/data/db
,并且myjstest.js
驻留在/data/db/scripts
目录中,则mongo shell中的以下调用将是等效的:
load("scripts/myjstest.js")
load("/data/db/scripts/myjstest.js")
没有load()函数的搜索路径。 如果所需的脚本不在当前工作目录或完全指定的路径中,mongo将无法访问该文件。
个人补充
实例:
// WorkSpace/LearnCode/mongo-scripts/script.js
conn = new Mongo('127.0.0.1:27017');
db = conn.getDB('cw');
boxes = db.boxes.find();
printjson(boxes.next() );
然后打开终端:
mongo script.js
结果:
▶ mongo mongo.js
MongoDB shell version v3.4.0-rc4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.0-rc4
{
"_id" : "1192336012",
"campus" : "北华大学",
"building" : "东校区9号楼",
"room" : "103",
"nCustomers" : "8",
"activateAt" : ISODate("2016-09-27T10:04:02.342Z")
}