需求
在写小工具的时候,经常遇到需要从mongodb 里面查东西来用,因为要跟其他bash 工具链结合在一起用,所以最理想的方法是能够在shell 上执行查询,然后pipe 给接下来的工具做处理。
方案
幸运的是对于mongo 来说做起来是很方便的,只需要使用mongo --eval 即可。例1:
mongo 192.168.1.2:27060/mybase --eval 'printjson(db.tasks.findOne())'
这段脚本首先链接上地址为192.168.1.2:27060 的mongodb 服务器,然后在mybase 数据库下执行后面引号内的javascript,这段javascript 和mongoshell 里的并没有区别。值得注意的是这里是用的mongoshell 的一个全局函数 printjson 用来把查询结果转换成json 打印出来。
例2:
mongo 192.168.1.2:27060/mybase --eval 'db.tasks.find({type:"danger"}).forEach(printjson)'
在查询结果不唯一的时候,即不像例1那样使用findOne 返回单一结果,而是返回一个“结果集” 的时候,mongo 实际上返回的是一个可遍历的cursor,这时候如果你用printjson 把查询语句包起来printjson(db.find()...) 的话,实际打印出的是cursor 的内容。正确的做法是forEach 遍历cursor 然后打印每一项。
例3:
mongo 192.168.1.2:27060/mybase --eval 'db.tasks.find({type:"danger"}).forEach(function(e){print(e._id.str)})'
找出所有属性为“danger” 的task 的id,这里使用ObjectID的str 属性来把他转换成字符串。
总结
注意返回内容,一般是一个可遍历的cursor。
参考:
http://stackoverflow.com/questions/4837673/how-to-execute-mongo-commands-through-shell-scripts