q789321 发表于 2018-10-26 09:11:05

MongoDB-Map&Reduce

  模拟大数据搜索场景--‐何旭东
  请使用脚本插入本次课程中的Map&Reduce举例的学生表到1000w条文档。字段
  保持不变。
  使用Map&Reduce 计算出10
  db.users.find();
  {
  "_id"
  :
  ObjectId("55ca9ae785b177a46da9494f"),
  "classid"
  :
  1,
  "age"
  :
  37,
  "name"
  :
  "name0"
  }
  {
  "_id"
  :
  ObjectId("55ca9ae785b177a46da94950"),
  "classid"
  :
  1,
  "age"
  :
  12,
  "name"
  :
  "name1"
  }
  {
  "_id"
  :
  ObjectId("55ca9ae785b177a46da94951"),
  "classid"
  :
  1,
  "age"
  :
  31,
  "name"
  :
  "name2"
  }
  {
  "_id"
  :
  ObjectId("55ca9ae785b177a46da94952"),
  "classid"
  :
  2,
  "age"
  :
  27,
  "name"
  :
  "name3"
  }
  脚本创建模拟数据:
  for (var i=1;
  i mapf = function(){emit(this.classid, 1)}
  function (){emit(this.classid, 1)}
  Reduce 函数
  Reduce 函数接收的参数类似Group 效果,已经按照健聚合过一次
  将Map 返回的键值序列组合成{key, }传递给
  Reduce,Reduce 函数对values 统计
  > reducef=function (key, values) {
  ... var count = 0;
  ... values.forEach(function (v) {count += v;}); return count;
  ... }
  function (key, values) {
  var count = 0;
  values.forEach(function (v) {count += v;}); return count;
  }
  Options 更多的控制细节
  > res = db.runCommand({ mapreduce:"users", map:mapf, reduce:reducef,
  out:"users_res",
  finalize:ff,
  query:{age:{$lt:10}}
  ...
  });
  {
  "result"
  :
  "users_res",
  "timeMillis"
  :
  6251,
  "counts"
  :
  {
  "input"
  :
  333716,
  "emit"
  :
  333716,
  "reduce"
  :
  6676,
  "output"
  :
  2
  },
  "ok"
  :
  1
  }
  >
  结果:
  >
  db.users_res.find();
  {
  "_id"
  :
  1,
  "value"
  :
  {
  "classid"
  :
  1,
  "count"
  :
  167142
  }
  }
  {
  "_id"
  :
  2,
  "value"
  :
  {
  "classid"
  :
  2,
  "count"
  :
  166574
  }
  }
  1 班小于10 岁的有167142 人。2 班小于10 岁的有166574 人。
  继续统计小于20 岁以下,每个班学生的个数:
  > res = db.runCommand({ mapreduce:"users", map:mapf, reduce:reducef,
  out:"users_2res", finalize:ff, query:{age:{$lt:20}}
  ... ... });
  {
  "result" : "users_2res",
  "timeMillis" : 23247,
  "counts" : {
  "input" : 3666243,
  "emit" : 3666243,
  "reduce" : 73326,
  "output" : 2
  },
  "ok" : 1
  }
  > db.users_2res.find();
  { "_id" : 1, "value" : { "classid" : 1, "count" : 1832306 } }
  { "_id" : 2, "value" : { "classid" : 2, "count" : 1833937 } }
  1 班小于20 岁的有1832306 人。2 班小于20 岁的有1833937 人。

页: [1]
查看完整版本: MongoDB-Map&Reduce