通过mongoid Rails执行mongodb脚本

时间:2015-05-26 08:27:31

标签: javascript ruby-on-rails mongodb mongoid

我在js文件中有一个mongo db脚本:

query.js

//conn = new Mongo();
//db = conn.getDB("dbName");
functionFoo = function (arg){
    //----process arg
}

我也有一个args数组,称为args_array,(我使用mongoid从数据库中获取),我想做这样的事情:

args_array.each do |arg|
   //some how call functionFoo(arg) from the query.js file
end

这可能是在轨道上吗?

我能够从终端执行该文件,但我想将它包装在我的应用程序中,以便我可以从rails console中使用它。

2 个答案:

答案 0 :(得分:2)

我知道这个老问题,但万一你还需要回答或其他任何人。这个答案适用于gem mongo ~> 2.3

在这种情况下,回答你的关键不需要mongoid - 在我的情况下我将它用于rails模型,所以我只使用mongoid(5.1.0)来获得数据库连接db = Mongoid.default_client.database - 或者你可以得到/使用mongo gem创建数据库。

要在数据库上执行javascript,您需要调用command方法db.command({ eval: 'js' })db.command({ eval: 'function(n){return db.projects.find({name: n}).toArray();}', args: ['beskhai'], nolock: true })

要获得结果,您可以调用.documents db.command(...).documents,返回是一个散列{retval:它将返回您的脚本,ok:如果成功则为1} {{}的返回对象1}}来电是command https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/operation/result.rb

答案 1 :(得分:0)

我使用的是MongoID 6.0.1,您可以轻松查询所需内容:

    db ||= Mongoid.default_client.database
    f = """
    functionFoo = function (arg){
    //----process arg
    }
    """
    result = db.command({:$eval => f, args: [arg1, arg2, ...arg_n], nolock: true})
    @result_data = result.first['retval']

它不仅仅是一个功能,只是你想用命令做的每一件事。 我的例子是:

db ||= Mongoid.default_client.database
f = """
var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db[n].stats()); });
stats = stats.sort(function(a, b) { return b['size'] - a['size']; });
return stats;
"""
result = db.command({:$eval => f, args: [], nolock: true})
@result_data = result.first['retval']