Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过mongoid Rails执行mongodb脚本_Javascript_Ruby On Rails_Mongodb_Mongoid - Fatal编程技术网

Javascript 通过mongoid Rails执行mongodb脚本

Javascript 通过mongoid Rails执行mongodb脚本,javascript,ruby-on-rails,mongodb,mongoid,Javascript,Ruby On Rails,Mongodb,Mongoid,我在js文件中有一个mongo db脚本: query.js //conn = new Mongo(); //db = conn.getDB("dbName"); functionFoo = function (arg){ //----process arg } 此外,我还有一个名为args_array的args_array(我使用mongoid从数据库中获取)数组,我想对其执行如下操作: args_array.each do |arg| //some how call func

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

query.js

//conn = new Mongo();
//db = conn.getDB("dbName");
functionFoo = function (arg){
    //----process arg
}
此外,我还有一个名为
args_array
args_array
(我使用mongoid从数据库中获取)数组,我想对其执行如下操作:

args_array.each do |arg|
   //some how call functionFoo(arg) from the query.js file
end
这在rails中可能吗


我可以从终端执行该文件,但我想将其包装到我的应用程序中,以便我可以从rails控制台使用它。

我知道这个老问题,但万一您仍然需要答案或其他任何答案。这个答案适用于
gemmongo~>2.3

在这种情况下,回答您不需要mongoid的关键是-在我的情况下,我将它用于rails模型,因此我使用mongoid(5.1.0)仅用于获取DB连接
DB=mongoid.default\u client.database
-或者您可以使用mongo gem获取/创建数据库

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


要获得结果,您可以调用
.documents
,返回值是一个散列{retval:它将返回您的脚本,ok:如果成功,则为1}。
command
调用的返回对象是
[Mongo::Operation::result]
我正在使用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']

看起来您正试图在Ruby中直接调用JavaScript查询;您必须通过一个JavaScript解释器(例如
mongo
shell)才能理解这些内容。您的实际需求是什么?您只需要评估文件中保存的查询列表,还是它们必须是JavaScript函数?我有一个JavaScript函数,用于更新文档负载,而不是查询列表。。如果它是一个独立的脚本,我可以使用
exec
来完成,但是函数从ruby数组中获取参数,这就是我的问题。您仍然可以使用ruby的
exec
传递参数,并使用。然而,我认为用一种语言编写所有函数要比混合使用JavaScript+Ruby明智得多。您可以通过JavaScript获取所需的查询参数,也可以将现有JavaScript函数移植到Ruby。。。实际上,与javascript编写的查询相比,用ruby编写查询会影响时间复杂度。正确的?由于查询很长,所以我同时用javascript编写了查询的主要部分,试图以某种方式通过rails控制台对其进行访问。我不清楚查询的时间复杂性是什么意思。如果您正在编写要在
mongo
shell中运行的函数,那么这些函数仍然在客户端执行,类似于Ruby中的查询。如果您可以直接通过Ruby驱动程序运行这些查询,那么从Rails控制台生成
mongo
shell来运行函数和查询会增加复杂性和开销。与
mongo
shell相比,Ruby驱动程序还将具有更丰富的I/O方法。如果您可以发布一个正在运行的函数和查询的实际示例,并描述预期目标,这将有所帮助。可能有更直接的方法。