2012-01-04 3 views
2

他のレーキタスクの後に実行する必要がある一連のデータベース管理タスクがあります。だから私はRuby Mongo driver sourceといくつかのブログの記事を読んで、私はこのコードで終わった:私は、いくつかの機能と1最終1持って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); 

は、[OK]を、ので、それがすべてです私がコマンドラインから直接実行するとうまく動作します。まあ、それはそうです。しかし、私は結果の価値を取ってそれを私のログに蓄積したいと思います。私はその値をデータベースに保存し、それを引き出すことができました。より良い方法があるように見えます。私はそれを私のログに入れます:

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

それはそれほど爆破しなかったこと以外は私には分かりません。だから、私はupdate_statsの戻り値を取得し、それを私のRubyコードに記録する方法はありますか?

+0

update_stats.jsの外観はどうですか? – Nat

+0

@Natその約130行は一連のレコードを繰り返し、いくつかの計算をしてレコードを更新します。それは私の仕事に含めるには大きすぎます。あなたが探しているものは何ですか? – jcollum

答えて

1

OK、ここには2つの潜在的な問題があります。

最初の問題は、データベースに対してJSファイルを実行していることですが、これがどのように機能するかはわかりません。それはモンゴイドの特別な特徴のようですか?あなたはどんな結果を期待していますか?

第2の問題は、レーキマシンにドライバアクセスがある場合にJSファイルをまったく使用しない理由が明確でないことです。実行中のコマンドは、単にRubyドライバを介して直接コマンドとして実行することはできませんか?

通常、任意のJSファイルをインポートする必要があるのは、mongoプログラムを使用して直接ジョブを呼び出すときだけです。だから、ジョブからmongo my_map_reduce.jsを実行すると意味があります。

実行中のコマンドがドライバ経由でアクセス可能であれば(これは時間の99%に当てはまります)。それからRubyにadminスクリプト全体を書いてください。

+0

合意して、あなたはすべてをルビーに書くべきです。あなたは、ルビードライバを使って、すべてのことができるはずです。 –

+1

皆さんはひとつ欠けています:Mongodbはネイティブでjsを実行します。だから、このようなデータベースでしか起こっていないことについては、jsはおそらくより良いパフォーマンスを持つつもりです。私はそれについて何の証拠も持っていませんが、私にとってはそれほど意味がありません。 – jcollum

+1

ここでの問題は、MongoDBがネイティブにJSを実行しない*ということです。実際にはJS VMを使ってMap/Reduceのような特定のコマンドを実行します。これは、10genが(それはネイティブな)新しいアグリゲーションフレームワークを開発し、マルチスレッドを可能にするためにJSエンジンを切り替えるように働いていることを実証しました。しかし、あなたの場合は、シェル(* a JSドライバ*)を使用してファイルから一連のコマンドを実行しているだけなので、ここではパフォーマンス上の利点はありません。 –

関連する問題