Javascript 在MapReduce MongoDB中按键分组数据
我正在MongoDB中尝试MapReduce程序寻找共同的朋友,我在MongoDB中对密钥进行排序后获得了以下数据Javascript 在MapReduce MongoDB中按键分组数据,javascript,mongodb,mapreduce,Javascript,Mongodb,Mapreduce,我正在MongoDB中尝试MapReduce程序寻找共同的朋友,我在MongoDB中对密钥进行排序后获得了以下数据 {"user" : " Hari","friend" : "Shiva", "friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]} {"user" : "Hari","friend" : " Shiva", "friendList" : ["Karma"," Tom"," Ram"," Bindu"," Sh
{"user" : " Hari","friend" : "Shiva",
"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]}
{"user" : "Hari","friend" : " Shiva",
"friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva",
" Kishna"," Bikash"," Bakshi"," Dinesh"]}
现在,我想将这些具有相同键的数据集分组到单个组中,在将键值对发送到还原器之前,在map函数中使用Javascript,如何对数据进行分组?例如,我想要像这样的输出
{"user" : " Hari","friend" : "Shiva",
"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"],["Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]}
您可以将两条记录的
friendlist
数组合并到一个数组中,以创建如下对象:
{
"_id": {
"user": " Hari",
"friend": "Shiva"
},
"value": {
"friendList": [
"Hanks",
" Tom",
" Karma",
" Hari",
" Dinesh",
"Karma",
" Tom",
" Ram",
" Bindu",
" Shiva",
" Kishna",
" Bikash",
" Bakshi",
" Dinesh"
]
}
}
{
"_id": {
"user": " Hari",
"friend": "Shiva"
},
"value": {
"friendList": [
[
"Hanks",
" Tom",
" Karma",
" Hari",
" Dinesh"
],
[
"Karma",
" Tom",
" Ram",
" Bindu",
" Shiva",
" Kishna",
" Bikash",
" Bakshi",
" Dinesh"
]
]
}
}
请参阅处的代码以创建此单个对象
如果希望好友列表
为二维数组,即:
{
"_id": {
"user": " Hari",
"friend": "Shiva"
},
"value": {
"friendList": [
"Hanks",
" Tom",
" Karma",
" Hari",
" Dinesh",
"Karma",
" Tom",
" Ram",
" Bindu",
" Shiva",
" Kishna",
" Bikash",
" Bakshi",
" Dinesh"
]
}
}
{
"_id": {
"user": " Hari",
"friend": "Shiva"
},
"value": {
"friendList": [
[
"Hanks",
" Tom",
" Karma",
" Hari",
" Dinesh"
],
[
"Karma",
" Tom",
" Ram",
" Bindu",
" Shiva",
" Kishna",
" Bikash",
" Bakshi",
" Dinesh"
]
]
}
}
您可以使用Friend上的代码,如果map reduce将对同一个键的值进行分组并将其作为键提供给reduce,列出[values],那么您为什么要为同一个键的数据值分组呢 我强烈建议您在reducer中执行分组任务,而不是Map。其背后的主要原因是,由于map任务逐记录读取并执行collect操作,因此识别相同密钥组的负担由算法承担,而如何使用分组值设计输出则由我们在reduce逻辑中负责 您可以将减速机的输出用于进一步处理 输入:
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]}}
{"_id" : {"user" : "Hari","friend" : " Shiva"},
"value" : {"friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva",
" Kishna"," Bikash"," Bakshi"," Dinesh"]}}
var mapper = function () {
var key = {"user" : this.user, "friend" : this.friend};
emit(key, {"value":{"friendList":this.friendList}});
};
var reducer = function(key, value){
var combinedfriendList = {"friendList":[]};
for (var i in values) {
var inter = values[i];
for (var j in inter.friendList) {
combinedfriendList.friendList.push(inter.friendList[j]);
}
}
return {"_id": {"user":key.user, "friend": key.friend}, "value":combinedfriendList};
};
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh","Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]}}
Mapreduce代码:
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]}}
{"_id" : {"user" : "Hari","friend" : " Shiva"},
"value" : {"friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva",
" Kishna"," Bikash"," Bakshi"," Dinesh"]}}
var mapper = function () {
var key = {"user" : this.user, "friend" : this.friend};
emit(key, {"value":{"friendList":this.friendList}});
};
var reducer = function(key, value){
var combinedfriendList = {"friendList":[]};
for (var i in values) {
var inter = values[i];
for (var j in inter.friendList) {
combinedfriendList.friendList.push(inter.friendList[j]);
}
}
return {"_id": {"user":key.user, "friend": key.friend}, "value":combinedfriendList};
};
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh","Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]}}
预期输出:
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh"]}}
{"_id" : {"user" : "Hari","friend" : " Shiva"},
"value" : {"friendList" : ["Karma"," Tom"," Ram"," Bindu"," Shiva",
" Kishna"," Bikash"," Bakshi"," Dinesh"]}}
var mapper = function () {
var key = {"user" : this.user, "friend" : this.friend};
emit(key, {"value":{"friendList":this.friendList}});
};
var reducer = function(key, value){
var combinedfriendList = {"friendList":[]};
for (var i in values) {
var inter = values[i];
for (var j in inter.friendList) {
combinedfriendList.friendList.push(inter.friendList[j]);
}
}
return {"_id": {"user":key.user, "friend": key.friend}, "value":combinedfriendList};
};
{"_id" : {"user" : " Hari","friend" : "Shiva"},
"value" : {"friendList": ["Hanks"," Tom"," Karma"," Hari"," Dinesh","Karma"," Tom"," Ram"," Bindu"," Shiva"," Kishna"," Bikash"," Bakshi"," Dinesh"]}}
希望这能给你一些帮助。你可以在你的环境中测试它(如果需要,可以更改)并分享你的反馈。你可以简单地进行
聚合
,根据用户和朋友字段进行$group
db.collection.aggregate([
{$group:{
_id:{
user:'$user',
friend:'$friend'
},
friendList:{$push:'$friendList'}
}},
// project the fields as your wish
{$project:{
user:'$_id.user',
friend:'$_id.friend',
friendList:'$friendList'
}}
])
希望此聚合管道可以返回您期望的结果这里我希望输出包含两个数组,正如我上面所指出的,我正在使用javascript实现mapreduce函数,我不知道更多的javascript,所以我可以按上面的格式获取它吗?这不是有效的JSON:
{“friendList”:[“Hanks”、“Tom”、“Karma”、“Hari”、“Dinesh”],[“Karma”,“汤姆”、“拉姆”、“宾都”、“湿婆”、“基须那”、“比卡什”、“巴克什”、“迪内什”]}
所以我创建了一个串联数组。请为最终的好友列表提供一个有效的JSON
另请参见编辑后的答案以创建一个二维好友列表
我已经尝试了,但无法得到我想要的…..我想你会清楚我在做什么…非常感谢你的帮助我的朋友..@bikas请参考我的直肠请不要发表评论,希望能有所帮助