我們在2.0開始使用Mongo。作爲我們經常運行的查詢的一部分,我們運行map/reduce作業,這些作業也會在這些作業執行時從其他集合中提取數據。Mongo 2.4 - 使服務器端代碼中的db對象可用(map/reduce)
由於mongo 2.4,此功能被刪除(http://docs.mongodb.org/manual/release-notes/2.4/#additional-limitations-for-map-reduce-and-where-operations),唯一的建議是「重構你的代碼」。
那麼,有沒有一種方法來重構代碼?我知道這是一個普遍的問題,但我要求提供一個通用的應用程序。涉及的集合和交叉查詢的大小和使用具有足夠的多樣性。
在這一點上,我甚至會採取一個補丁,將db
對象帶回服務器代碼範圍。看來,下面的補丁就足夠了(是的,我知道它有這些安全隱患,但我還沒有使用的碎片這是最快捷的方式爲我們奪回我們賴以生存的功能。):
diff --git a/src/mongo/db/commands/mr.cpp b/src/mongo/db/commands/mr.cpp
index 742392f..225a2b7 100644
--- a/src/mongo/db/commands/mr.cpp
+++ b/src/mongo/db/commands/mr.cpp
@@ -623,6 +623,7 @@ namespace mongo {
void State::init() {
// setup js
_scope.reset(globalScriptEngine->getPooledScope(_config.dbname, "mapreduce").release());
+ _scope->localConnect(_config.dbname.c_str());
if (! _config.scopeSetup.isEmpty())
_scope->init(&_config.scopeSetup);
的問題是,由於數據庫對象分片怎麼跑envos這個功能實際上是一個安全漏洞,可能被用來繞過對其他數據庫的認證來攻擊你的數據。至於如何重構你的代碼;你到底在做什麼?你能給我們一些邏輯嗎? – Sammaye 2013-05-02 17:47:51
@Sammaye不要讓我開始這個「安全」的事情。這不是一個修復,它是一個明顯的插件解決方案,而不是正確地重新設計/修復安全架構。我知道我總是可以重構我的查詢,以預先加入客戶端的數據,或將數據預加載到服務器範圍中。但我不想,而且性價比很高。 – 2013-05-02 18:25:15