【问题标题】:Mongodb Map-ReduceMongodb Map-Reduce
【发布时间】:2015-11-21 06:57:09
【问题描述】:

集合中的数据如下所示:

[{
  _id: 0001,
  imei:'123456',
  apps:[{packageName:'google'},{packageName:'twitter'}]

},{
  _id: 0002,
  imei:'654321',
  apps:[{packageName:'facebook'},{packageName:'twitter'}
  }]

我想计算packageName和用户的imei,就像这样:

[{
   packageName:'facebook',
   imeis:['123456']     
 },{
   packageName:'google',
   imeis:['123456','654321']
 },{
   packageName:'twitter',
   imeis:['123456','654321']

 }]

我的地图功能是:

function(){
  emit(this.packageName,this.imei);
};

reduce 函数是:

function(key , values){
  var ret = {packageName:key,imeis:values};
  return ret;
};

但结果只有 packageName ,imeis 为 null

可能是map函数写错了,不知道怎么改。

我是 mongoDB 的新手。请给我一些建议,谢谢

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    最好用聚合框架来完成。

    如果您的收藏名称是coll

    db.coll.aggregate([
        {$unwind:"$apps"}, 
        {$group:{
            "_id" : "$apps.packageName",
            "imeis" : { $addToSet: "$imei" }
        }}
    ],{allowDiskUse: true}
    )
    

    $unwind 聚合将apps 数组展平。

    $group 聚合组文档由packageName 提供。 $addToSet 运算符将所有 imei 唯一值分组到数组中。

    allowDiskUse 允许您在内存使用量超过限制(100 GB RAM)时将临时文件用于聚合管道阶段。或者,您可以使用 match 作为条件过滤器。

    【讨论】:

    • 非常感谢,它可以工作,但是如果我扫描所有集合,mongo 会显示消息:'异常:超过 $group 的内存限制,但不允许外部排序。通过 allowDiskUse:true 选择加入'。
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多