MongoDB高级查询[聚合Group]
2015-11-11 18:50
656 查看
Group
为了方便我还是把我的表结构贴上来:
Group大约需要一下几个参数。
key:用来分组文档的字段。和keyf两者必须有一个
keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
initial:reduce中使用变量的初始化
reduce:执行的reduce函数。函数需要返回值。
cond:执行过滤的条件。
finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的
这个主要是想 "通过渠道id查询到所有下属公司,并且不能重复" 所有要用 分组函数
看一下在Mongodb中的写法
下面我用Java对他们做一些测试。
OK,完成了。
为了方便我还是把我的表结构贴上来:
Group大约需要一下几个参数。
key:用来分组文档的字段。和keyf两者必须有一个
keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
initial:reduce中使用变量的初始化
reduce:执行的reduce函数。函数需要返回值。
cond:执行过滤的条件。
finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的
这个主要是想 "通过渠道id查询到所有下属公司,并且不能重复" 所有要用 分组函数
看一下在Mongodb中的写法
db.getCollection('applications').group({ key:{ developer_id : true, developer_name :true, platform_id : true, platform_name : true }, initial:{ developer_id : true, developer_name :true, platform_id : true, platform_name : true }, $reduce:function(doc,prev){ prev.developer_id = doc.developer_id, prev.developer_name = doc.developer_name, prev.platform_id = doc.platform_id, prev.platform_name = doc.platform_name }, condition:{'platform_id':"b59fd3da-20e3-48ce-be18-7505e3f21127"} })
下面我用Java对他们做一些测试。
/** * 通过渠道id查询到所有下属公司,并不重复 * @param platformId * @return */ @SuppressWarnings("unchecked") public List<Application> findDevByPlatformId(String platformId){ List<Application> devs = new ArrayList<Application>(); //reduce StringBuffer reduce = new StringBuffer(); reduce.append(" function(doc,prev){ "); reduce.append(" prev.developer_id = doc.developer_id, "); reduce.append(" prev.developer_name = doc.developer_name,"); reduce.append(" prev.platform_id = doc.platform_id,"); reduce.append(" prev.platform_name = doc.platform_name"); reduce.append(" }"); //key Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("developer_id", true); map1.put("developer_name", true); map1.put("platform_id", true); map1.put("platform_name", true); //initial Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("developer_id", true); map2.put("developer_name", true); map2.put("platform_id", true); map2.put("platform_name", true); Query query = Query.query(Criteria.where("platform_id").is(platformId)); DBObject result = mongoTemplate.getCollection("applications").group(new BasicDBObject(map1), query.getQueryObject(),new BasicDBObject(map2),reduce.toString()); Map<String,Application> map = result.toMap(); for (Map.Entry<String,Application> o : map.entrySet()) { JSONObject jsonStu = JSONObject.fromObject(o.getValue()); Application app = (Application)JSONObject.toBean(jsonStu, Application.class); if(app!=null){ System.out.println("developer_id="+app.getDeveloper_id()+ " developer_name="+app.getDeveloper_name()); } } return devs; }
OK,完成了。
相关文章推荐
- MongoDB的分片(9)
- MongoDB使用过程中的一些问题
- MongoDB 设置慢查询跟踪
- mongodb nodejs github
- MongoDB全面总结
- php操作mongodb
- MongoDB 学习笔记六 aggregate GROUP使用
- MongoDb 安装服务 以及 安全配置
- MongoDB replication set复制集(主从复制)(8)
- Node.js、express、mongodb 实现分页查询、条件搜索
- MongoDB基础CRUD JAVA语句
- MongoDb 用 mapreduce 统计留存率
- MongoDb 用 mapreduce 统计留存率
- 【MongoDB for Java】Java操作MongoDB
- Tokumx 代替 Mongodb 群集部署
- MongoDB的导入导出(7)
- mongodb开发遇到的问题总结
- 8天学通MongoDB——第一天 基础入门
- Python调用MongoDB使用心得
- mongoDB简明教程-python