• 在shell 上执行mongo 查询


    需求

      在写小工具的时候,经常遇到需要从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

  • 相关阅读:
    @雅礼集训01/13
    @hdu
    @bzoj
    @hdu
    @bzoj
    @雅礼集训01/10
    @codeforces
    @spoj
    @bzoj
    @bzoj
  • 原文地址:https://www.cnblogs.com/agentgamer/p/4994650.html
Copyright © 2020-2023  润新知