2012-01-04 59 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

相關問題