0
点赞
收藏
分享

微信扫一扫

MapReduce in MongoDB

在这篇文章里面,我们会演示如何在 MongoDB 中使用 MapReduce 操作。 我们会用 dummy-json 这个包来生成一些虚假的数据,然后用 Mongojs

如果想要快速看到结果,可以到 这里 里看看。

什么是 MongoDB ?

MongoDB 是一个 NoSQL 数据库,不像 MySQL 、MSSQL 和 Oracle DB 那样,MongoDB 使用集合(collections) 来代替表(tables)。同时,它用集合中的文档(documents)来代替表中的行(rows)。还有最好的一点是,所有文档都保存成 JSON 格式!你可以到这里学更多关于 MongoDB 的知识。

你可以从 这里 下载安装 MongoDB。

如果以前没用过 MongoDB,那么你可以记住下面这些命令:

Command

Result

mongod

启动 MongoDB 服务

mongo

进入 MongoDB Shell

show dbs

显示所有数据库列表

use <db name>

进入指定的数据库

show collections

进入数据库之后,显示该数据库中所有的集合

db.collectionName.find()

显示该集合中所有文档

db.collectionName.findOne()

显示该集合中第一个文档

db.collectionName.find().pretty()

显示漂亮的 JSON 格式

db.collectionName.insert({key: value})

插入一条新的记录

db.collectionName.update({ condition: value}, {$set: {key: value}}, {upsert: true})

会更新指定的文档,设置指定的值。如果 upserttrue,当没有找到匹配的文档时,会创建一条新的记录

db.collectionName.remove({})

移除集合中的所有文档

db.collectionName.remove({key: value})

移除集合中匹配到的文档

什么是 MapReduce ?

弄清楚 MapReduce 是如何运作的是非常重要的,如果对 MapReduce 过程不了解的话,你在运行 MapReduce 时很可能得不到你想要的结果。

从 mongodb.org 上的解析:

Map-reduce 是一种数据处理范例,用于将大量的数据变成有用的聚合结果。 对于 map-reduce 操作,MongoDB 提供了 mapReduce 的数据库命令。

在这非常简单的术语里面,mapReduce 命令接受两个基本的输入:mapper 函数和 reducer 函数。

Mapper 是一个匹配数据的过程,它会在集合中查询我们想要处理的字段,然后根据我们指定的 key 去分组,再把这些 key-value 对交给 reducer 函数,由它来处理这些匹配到的数据。

我们来看看下面这些数据:

[
  { name: foo, price: 9 },
  { name: foo, price: 12 },
  { name: bar, price: 8 },
  { name: baz, price: 3 },
  { name: baz, price: 5 }
]

我们想要计算出相同名字下的所需要的价钱。我们将会用这个数据通过 Mapper 和 Reducer 去获得结果。

当我们让 Mapper 去处理上面的数据时,会生成如下的结果:

Key

Value

foo

[9,12]

bar

[8]

baz

[3,5]

看到了吗?它用相同的 key 去分组数据。在我们的例子中,是用 name 分组。这些结果会发送到 Reducer 中。

现在,在 reducer 中,我们会得到上面表格中的第一行数据,然后迭代这些数据然后把它们加起来,这就是第一行数据的总和。然后 reducer 会对第二行数据做同样的事情,直到所有行被处理完。

最终的输出结果如下:

Name

Total

foo

21

bar

8

baz

8

现在你明白为什么 Mapper 会叫 Mapper 了吧 ! (因为它会创建一份数据的映射) 也明白了为什么 Reducer 会叫 Reducer 了吧 ! (因为它会把 Mapper 生成的数据归纳成一个简单的形式)

如果你运行一些例子,你就会知道它是怎么工作的拉。你也可以从官方文档 中了解更多细节。

创建一个项目

正如上文所说,我们可以在 mongo shell 中直接查询和看到输出结果。但是,为了让教程更加丰富,我们会构建一个 Nodejs 项目,在里面运行我们之前的任务。

Mongojs

我们会用 mongojs 去实现我们的 MapReduce。你可以用同样的代码跑在 mongo shell 里面,会看到同样的结果。

Dummy-json

我们会用 dummy-json 去创建一些虚假的数据。你可以在 这里 找到更多的信息。然后我们会在这些虚假数据上面运行 MapReduce 命令,生成一些有意义的结果。

我们开始吧!

首先,你要安装 Nodejs,你可以看看 这里。然后你要创建一个叫 mongoDBMapReduce 的目录。我们将会创建 package.json 文件来保存项目的详细信息。

运行 npm init 然后填入你喜欢的东西,创建完 package.json 后,我们要添加项目的依赖。 运行 npm i mongojs dummy-json --save-dev ,然后等几分钟之后,我们项目的依赖就安装好了。

生成虚假数据

下一步,我们要用 dummy-json 模块来生成虚假数据。 在项目的根目录创建一个名叫 dataGen.js 的文件,我们会把数据生成的逻辑保存到一个独立的文件里面。如果以后需要添加更多的数据,你可以运行这个文件。

把下面的内容复制到 dataGen.js 里面:

var mongojs = require('mongojs');
var db = mongojs('mapReduceDB', ['sourceData']);
var fs = require('fs');
var dummyjson = require('dummy-json');
 
var helpers = {
  gender: function() {
    return ""+ Math.random() > 0.5 ? 'male' : 'female';
  },
  dob : function() {
    var start = new Date(1900, 0, 1),
        end = new Date();
        return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
    },
  hobbies : function () {
    var hobbysList = []; 
    hobbysList[0] = [];
    hobbysList[0][0] = ["Acrobatics", "Meditation", "Music"];
    hobbysList[0][1] = ["Acrobatics", "Photography", "Papier-Mache"];
    hobbysList[0][2] = [ "Papier-Mache"];
    return hobbysList[0][Math.floor(Math.random() * hobbysList[0].length)];
  }
};
 
console.log("Begin Parsing >>");
 
var template = fs.readFileSync('schema.hbs', {encoding: 'utf8'});
var result = dummyjson.parse(template, {helpers: helpers});
 
console.log("Begin Database Insert >>");
 
db.sourceData.remove(function (argument) {
    console.log("DB Cleanup Completd");
});
 
db.

举报

相关推荐

0 条评论