javascript - 合并和聚合具有相同模式 mongodb 的两个或多个集合的某些字段

标签 javascript mongodb mapreduce aggregation-framework

我有一些具有相同架构的集合,我想对它们执行合并+聚合。架构很简单,如下所示:

{ 'fr': 1, 'to': 1, 'wg': 213}
{ 'fr': 1, 'to': 2, 'wg': 53}
{ 'fr': 2, 'to': 2, 'wg': 5521}

以下代码适用于合并两个集合,但我想知道是否有更快的解决方案和/或可以以类似的方式合并多个集合而无需创建嵌套调用的解决方案:

var c = db.collection('first').find()

c.each(function(err, doc) {
    if (err) throw err

    if (doc == null) {
        console.log('done')
        return
    }
    db.collection('second').findOne({
        'fr': doc['fr'],
        'to': doc['to']
    }, function(err, doc2) {
        if (err) throw err

        db.collection('my_results').save({
            'fr': doc['fr'],
            'to': doc['to'],
            'wg': doc['wg'] + doc2['wg']
        }, function(err) {
            if (err) throw err
        })
    })
})

最佳答案

这里没有绝对自由的操作,因为您无法与 MongoDB 进行连接。但是您可以使用mapReduce 及其一些功能获得您想要的输出。

所以首先创建一个映射器:

var mapper = function () {

  emit( { fr: this.fr, to: this.to }, this.wg )

};

然后是一个 reducer :

var reducer = function (key,values) {

  return Array.sum( values );

};

然后运行 ​​mapReduce 操作,并将输出设置为不同的集合:

db.first.mapReduce(mapper,reducer,{ "out": { "reduce": "third" } })

请注意其中的“out”选项,即 explained in this manual section 。要点是,尽管控制台中的统计输出可能会产生误导,但“减少”语句非常重要。当我们对另一个集合运行相同的代码时就是这样:

db.second.mapReduce(mapper,reducer,{ "out": { "reduce": "third" } })

结果中实际发生的情况是,第一个操作的输出也传递到第二个操作的“reduce”阶段。

最终结果是两个集合中具有相同键值的所有值将被添加到“第三个”集合中:

{ "_id" : { "fr" : 1, "to" : 1 }, "value" : 426 }
{ "_id" : { "fr" : 1, "to" : 2 }, "value" : 106 }
{ "_id" : { "fr" : 2, "to" : 2 }, "value" : 11042 }

如果您希望 frto 成为两种可能顺序的唯一组合,或者甚至运行另一个 mapReduce 或聚合,您可以做得更奇特一些超过这些结果。

关于javascript - 合并和聚合具有相同模式 mongodb 的两个或多个集合的某些字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23101895/

相关文章:

ruby-on-rails - 如何处理 rails/mongoid 中的出队连接超时?

java - 如何访问输出阶段的 Mapper/Reducer 计数器?

java - HtmlUnit 无法获取 IFRAME 添加的 js/ajax

javascript - 在 javascript 中每次点击时删除 svg 行新的最后一个节点

java - 一个组件需要一个名为 'mongoTemplate' 的 bean,但在 JUnit 5 Controller Test 中找不到

在 2 节点集群中使用压缩时 Hadoop 映射任务失败。但是当作为单个节点运行时,两个节点都工作正常

hadoop - mapreduce 程序 : Reducer is not getting called

javascript - 在 jQuery 中动态检测窗口宽度

javascript - 我的 Web 文档中未启用画中画的可能原因是什么?

mongodb - $exists 查询比扫描整个集合更快吗?