在collectionS上执行的mapreduce中访问集合中的数据

时间:2011-03-14 18:04:58

标签: mongodb database

如何在地图的“地图”部分中访问collectionB中的数据/ reduce在collectionA上执行?

如果有帮助,我会在collectionA中存储短语,我希望将每个短语拆分成地图中的单个单词,然后从collectionB中获取每个单词的特定值。

在代码中,我想象它看起来像这样......

map = function() {
    var key, value;
    var results = db["collectionB"].find({something_related_to_collectionA});

    results.forEach(function(result) {
        // Change the value
    });

    emit(key, value);
};
reduce = function(key, values) {
    // Perform the reduce
};
db["collectionA"].mapReduce(map, reduce, {out: "collectionC"});

2 个答案:

答案 0 :(得分:1)

所以,理论上这应该有效。但在实践中,你不想这样做。

这种类型的查找打开了一大堆蠕虫。例如,这如何与分片一起使用?想象一下,您的javascript位于shard2并且它正在尝试访问来自shard1的数据,这是如何工作的? shard2甚至不知道shard1存在。

如果你看一下你的代码,你就会从根本上试图重新创建一个JOIN语句。 MongoDB可扩展性的前提之一是它避免了连接b / c连接不能水平扩展。

这可能意味着更多的非规范化或某种形式的预处理或某些其他系统变更。理想情况下,如果您需要对集合执行map-reduce,您将设计该集合以包含执行此操作所需的所有数据。

答案 1 :(得分:0)

这应该可以正常工作。

据我所知,

db几乎可以从任何地方访问。我已经进行了一项(相当无用的)测试,它的工作方式与我预期的相当。你有什么问题?