使用Mongo mapReduce实现同城代理人配对查询及结果去重
基于MongoDB mapReduce的同城市代理人配对实现方案
实现思路
- 以
city作为map阶段的输出key,把当前代理人的id、first名、last名作为value输出 - reduce阶段收集同城市所有代理人的列表,双层遍历列表生成配对,仅保留agent_id更小的作为agent1,更大的作为agent2,天然避免(A,B)和(B,A)这类重复配对
- 输出结构完全匹配要求的格式
具体代码实现
定义map函数
var map = function() { emit(this.city, { agent_id: this.agent_id, first: this.first, last: this.last }); };
定义reduce函数
var reduce = function(key, values) { var pairedAgents = []; // 双层遍历生成所有不重复配对 for (var i = 0; i < values.length; i++) { for (var j = i + 1; j < values.length; j++) { // 按id大小排序赋值,避免反向重复配对 if (values[i].agent_id < values[j].agent_id) { pairedAgents.push({ agent1_first: values[i].first, agent1_last: values[i].last, agent2_first: values[j].first, agent2_last: values[j].last }); } else { pairedAgents.push({ agent1_first: values[j].first, agent1_last: values[j].last, agent2_first: values[i].first, agent2_last: values[i].last }); } } } return { result: pairedAgents }; };
执行mapReduce任务
如果需要持久化存储结果到新集合,执行以下命令:
db.agents.mapReduce( map, reduce, { out: "city_agent_pairs" } )
执行完成后查询结果集合即可获取数据:
db.city_agent_pairs.find()
如果仅需要临时查看结果不需要持久化,可修改out参数直接返回结果:
db.agents.mapReduce( map, reduce, { out: { inline: 1 } } )
内容的提问来源于stack exchange,提问作者Christopher Samuels
相关产品推荐
相关产品推荐

