2012-01-04 60 views
2

我有一套数据库管理任务需要在其他一些rake任务之后运行。所以,我读了Ruby Mongo driver source和一些博客文章和我结束了这段代码:如何从我发送给Mongo的脚本中返回值?

scr = open("./scripts/update_stats.js", &:read) 
db = Mongoid::Config::master 
result = db.command({:$eval => scr}) 
logger.debug result 
logger.warn "Finished updating stats" 

在脚本我有几个功能,并在最后一个一个:

r = update_stats(); 
print("update result:"); 
print (r); 

好了,所以它的所有当我通过命令行直接运行时运行良好。好吧,它似乎是。但我想把结果值存入我的日志中。我可以将该值存储到数据库中,然后将其拔出。似乎应该有更好的方法。我做得到它我的日志是:

DEBUG 2012-01-03 22:27:03 -0800 (21392) {"retval"=>nil, "ok"=>1.0} 

并没有告诉我不是,它没有炸毁多等。那么,我怎样才能得到update_stats的返回值并将其记录在我的Ruby代码中?

+0

你的update_stats.js怎么样? – Nat 2012-01-04 07:32:59

+0

@覆盖约130行迭代一组记录,进行一些计算然后更新记录;包含在我的OP中有点太大了。你正在寻找什么具体的东西? – jcollum 2012-01-04 15:10:33

回答

1

好的,所以这里有两个潜在的问题。

第一个问题是,你正在运行一个JS文件对数据库,但我不太清楚这是如何工作的。它看起来像Mongoid的一些特殊功能?你期待什么结果?

第二个问题是,如果耙机具有驱动程序访问权限,为什么要使用JS文件还不清楚。你运行的是哪些命令,不能直接通过Ruby驱动程序直接运行命令?

一般来说,唯一需要引入任意JS文件的时间是当您通过mongo程序直接调用作业时。所以你可以从cron工作中运行mongo my_map_reduce.js,这是有道理的。

如果您正在运行的命令可通过驱动程序访问(,99%的时间为)。然后,只需在Ruby中编写整个管理脚本。

+0

同意,你应该把整个事情写成红宝石。你应该可以使用Ruby驱动程序做几乎所有的事情。 – 2012-01-04 14:46:19

+1

你们错过了一件事:Mongodb本身运行js。所以对于这种只发生在数据库中的事情,js可能会有更好的性能。我没有任何证据,但它确实对我很有意义。 – jcollum 2012-01-04 15:34:29

+1

这里的问题是MongoDB本身并不*运行JS。事实上,它使用JS VM来运行某些命令,如Map/Reduce。这已经被证明是无效的,10gen已经开发了一个新的聚合框架(这是本地的),并且他们正在努力转换JS引擎以允许多线程。然而,就你而言,你只是使用shell(* JS驱动程序*)从文件运行一系列命令,所以你在这里没有获得任何性能优势。 – 2012-01-05 08:33:04

相关问题