打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MongoDB中MapReduce的应用MongoDB中MapReduce的应用
2011-03-03 16:20
在MongoDB中可以使用MapReduce进行一些复杂的聚合查询
Map函数和Reduce函数可以使用JavaScript来实现
可以通过db.runCommand或mapReduce命令来执行一个MapReduce的操作:
db.runCommand(
{ mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>
[, query : <query filter object>]
[, sort : <sort the query. useful for optimization>]
[, limit : <number of objects to return from collection>]
[, out : <output-collection name>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
[, scope : <object where fields go into javascript global scope >]
[, verbose : true]
}
);
#或者使用一个包装后的Helper命令
db.collection.mapReduce(mapfunction,reducefunction[,options]);
如果没有定义out,则它执行后默认生成一个临时的collection,当client连接断开后,该collection会自动被清除
一个简单的列子,有一个user_addr的collection,结果如下:
db.user_addr.find({'Uid':'test@sohu.com'})
{ "_id" : ObjectId("4bbde0bf600ac3c3cc7245e3"), "Uid" : "yangsong@sohu.com", "Al" : [
{
"Nn" : "test-1",
"Em" : "test-1@sohu.com",
},
{
"Nn" : "test-2",
"Em" : "test-2@sohu.com",
},
{
"Nn" : "test-3",
"Em" : "test-3@sohu.com",
}
] }
存储了一个用户(Uid)对应的联系人信息(Al),现在要查询每个Em联系人对应的数目,则建立如下的MapReduce
m=function () {
for (index in this.Al) {
emit(this.Al[index].Em, 1);
}
}
r=function (k, vals) {
var sum = 0;
for (index in vals) {
sum += vals[index];
}
return sum;
}
res=db.user_addr.mapReduce(m,r)
{
"result" : "tmp.mr.mapreduce_1272267853_1",
"timeMillis" : 29,
"counts" : {
"input" : 5,
"emit" : 26,
"output" : 26
},
"ok" : 1,
}
db[res.result].find()
MongoDB中的group函数实际上也需要借助MapReduce来实现
如:按照uid来group,计算出每个uid有多少个联系人
r=function (obj,prev) {
prev.sum += obj.Al.length;
}
db.user_addr.group({key:{'Uid':1},reduce:r,initial:{sum:0}})
转自 http://www.51yu.cn/tags/mongodb/ 高飞鸟 hi.baidu.com/ixigua
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Elasticsearch、MongoDB和Hadoop比较
model.mongo
MongoDB
MongoDB常用的操作命令
MongoDB在58同城的应用实践
在MongoDB中实现聚合函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服