Mongodb Map-Reduce

时间:2015-11-21 06:57:09

标签: mongodb mapreduce

集合中的数据如下所示:

reset()

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

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

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

我的地图功能是:

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

 }]

减少功能是:

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

但结果只有packageName,imeis为null

也许地图功能错了,但我不知道如何重写它。

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

1 个答案:

答案 0 :(得分:0)

使用聚合框架可以做得更好。

如果您的收藏名称为coll

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

$unwind聚合会使apps数组变平。

packageName聚合组文档imei$group运算符将所有ZipArchive Object ( [status] => 0 [statusSys] => 0 [numFiles] => 11 [filename] => C:\xampp\htdocs\bitcoinreports\uploads\data123.xlsx [comment] => ) 个唯一值分组到数组中。

如果内存使用超出限制(100 GB RAM),

$addToSet允许您将临时文件用于聚合管道阶段。或者,您可以使用allowDiskUse作为条件过滤器。