今天学习了一下mongodb上的mapreduce

一个兄弟做了个爬虫,把一个网站爬回了mongodb里面,结果数据结构异常麻烦,嵌套了快10层。
使用起来非常痛苦。
本来想要通过aggregate的$group来做一次计数,结果因为嵌套的层数太多,实在是搞不明白应该怎么做。
今天干脆祭出了MapReduce神器:

db.mathcollectionbrainly.mapReduce(function() {
  this.data.feed.edges.forEach(function(e) {
    if (e.node) {
      e.node.attachments.forEach(function(qa) {
        if (qa) {
            emit('question_attachments', 1)
        }
      });
      if (e.node.answers.nodes) {
        e.node.answers.nodes.forEach(function(a) {
          a.attachments.forEach(function(aa) {
            if (aa) {
                emit('answer_attachments', 1)
            }
          })
        })
      }
    }
  })
},
function(key,values) {
  return Array.sum(values)
},
{out: {inline: 1}})

很快把数算出来了。
后来还想通过MapReduce来将数据分拆开,也写成功了,用了几次之后发现,杀鸡用了牛刀。
其实mongodb里面是可以直接用js搞定这件事情的:

db.collecitonA.find().forEach(function(x){db.collectionB.insert()})

这个效果更好。使用MapReduce做出来的版本有问题,因为找不到唯一key,所以有可能会出现多个item挤在一条记录里面的情况。