通过mongoid Rails的执行脚本的mongodb(Executing mongodb scr

2019-10-23 04:53发布

我有一个js文件蒙戈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

这是可能的轨道?

我能够执行从终端的文件,但我想它包在我的应用程序,这样我可以从轨控制台使用它。

Answer 1:

我知道这个老问题,但如果你仍然需要回答或任何其他人。 这个答案可与gem mongo ~> 2.3

关键要回答你不需要mongoid在这种情况下-在我的情况下,我使用它的轨道模型,所以我用mongoid(5.1.0)只拿到DB连接db = Mongoid.default_client.database -或者你可以得到/使用蒙戈宝石创建数据库。

要在数据库中执行的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,如果成功}的返回对象command调用[Mongo::Operation::Result] https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/operation/result.rb 。



Answer 2:

我使用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']


文章来源: Executing mongodb scripts via mongoid Rails