Mongodb 在对collectionA执行的映射/还原中访问collectionB中的数据

Mongodb 在对collectionA执行的映射/还原中访问collectionB中的数据,mongodb,database,Mongodb,Database,如何在collectionA上执行的映射/还原的“映射”部分中访问collectionB中的数据 如果有帮助的话,我将短语存储在collectionA中,我希望将每个短语拆分为地图中的单个单词,然后从collectionB中获取每个单词的特定值 在代码中,我想象它看起来像这样 map = function() { var key, value; var results = db["collectionB"].find({something_related_to_collectio

如何在collectionA上执行的映射/还原的“映射”部分中访问collectionB中的数据

如果有帮助的话,我将短语存储在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"});
这应该行得通

据我所知,
db
几乎可以从任何地方访问。我做了一个(很没用的)测试,结果和我预期的差不多。你有什么问题?

应该可以


据我所知,
db
几乎可以从任何地方访问。我做了一个(很没用的)测试,结果和我预期的差不多。你有什么问题?

所以,理论上这应该是可行的。但实际上,你不想这样做

这种类型的查找打开了一整罐蠕虫。例如,这如何与切分一起工作?假设您的javascript在
shard2
上,它试图从
shard1
访问数据,这是如何工作的
shard2
甚至不知道
shard1
存在

如果您查看代码,您基本上是在尝试重新创建一个
JOIN
语句。MongoDB可伸缩性的前提之一是它避免了连接b/c连接不能水平伸缩


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

因此,理论上这应该是可行的。但实际上,你不想这样做

这种类型的查找打开了一整罐蠕虫。例如,这如何与切分一起工作?假设您的javascript在
shard2
上,它试图从
shard1
访问数据,这是如何工作的
shard2
甚至不知道
shard1
存在

如果您查看代码,您基本上是在尝试重新创建一个
JOIN
语句。MongoDB可伸缩性的前提之一是它避免了连接b/c连接不能水平伸缩

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