良玉的博客 点点滴滴,积水成河_良玉的博客_页游、手游linux运维工程师之路

MongoDB执行外部脚本文件(shell下操作Mongodb)

Shell中执行JS文件

MongoDB的Shell不仅仅是一个交互式的Shell,他也可以执行JS文件,除了制定一个*.js后缀的文件之外,
你也可以使用参数[--eval]来执行一小段的JS命令。

通过这种使用js文件的方式调用Shell就能让你代执行的任务不需要任何特定驱动或者语言支持;
也能让他可以定时执行,或者部署在自动化的任务中。  
不过要注意在Javascript中的一些格式转换问题,所以你要很仔细的编写这些Javascript操作文件。
(建议:多多使用print,输出你的程序执行情况,或者错误|异常输出。)

执行Js的方法通常用来执行的任务包括:
1.备份
2.配置执行Map-Reduce命令
3.离线统计报表
4.管理员操作

一. 在Shell中执行一个脚本文件

--[CODE]--       ./mongo server:27017/dbname --quiet my_commands.js

Shell命令语法请参考:http://docs.mongodb.org/manual/reference/javascript/
该条命令会执行我的“my_commands.js”就像直接将命令输入到Shell中一样执行。

1. ./mongo:   启动交互Shell, 可以让你的选择更多一些
2. server:27017/dbname: 基础连接信息
3.--quiet: 这就是该命令的一个标志,当构建一些无人值守脚本的时候这个标志会选择性的移除一些开头信息(那些不是必须的信息)
4.my_commands.js: 包含了一系列代执行的Shell代码的文件


--quiet 
这个选项将会移除显示在开头的信息当你正常运行Shell的时候
注: 如下 就移除了:
“MongoDB shell version: 2.1.0
connecting to: test”

--[CODE]--       
$ mongo
MongoDB shell version: 2.1.0
connecting to: test
> ^C
bye
$ mongo --quiet
> ^C


--eval 
这个选项就是为了让用户技能使用完整的Js文件执行命令的同时又能执行一段Js代码

--[CODE]--       
./mongo test --eval "printjson(db.getCollectionNames())"



使用Js文件和交互式操作的不同点

一.打印(显示)
当使用交互式Shell的时候,Shell本身会打印出返回的结果而且会格式化(如果有必要的话)。
在Shell中已经非常方便的这样做了,然而,当编写一个脚本文件的时候,这种打印操作需要明确的定义。
这儿有俩非常常用的方法用来打印信息:

1.print(): 用于常用的Js
2.printjson(): 打印完美格式化的Json返回对象

例:从查询结果中打印前十个对象
--[CODE]--
db.foo.find({x:1}).forEach(printjson)

二. [use dbname]  “选择数据库”命令

这个命令在脚本模式下不起作用,取而代之的你需要明确定义数据库在连接字符串中,也就是上面例子中所写的那样。

当然你也可以在脚本文件内部穿件一个连接:
--[CODE]--
var x = new Mongo('192.168.30.1:18000');
var mydb = x.getDB('mydb');
var mydb = connect('192.168.30.1:18000/mydb');

或者直接为"db"变量赋值
--[CODE]--
db = db.getSiblingDB("otherdb") //same as use otherdb


三. it
迭代在非交互式Shell环境中不起作用

四. getLastError
当在Shell中执行更新/插入命令时,Shell会自动的等待一个回复,(相当于执行了 getLastError)。

这在执行脚本文件的时候不一样,你需要在执行完更新/插入命令后执行getLastError来等待这个操作的状态。
--[CODE]--
db.getLastErrorObj()
// or
db.getLastError()


留言列表
发表评论
来宾的头像