我们在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