我们从 2.0 开始使用 Mongo。作为我们经常运行的查询的一部分,我们运行 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 );