MongoDB高级查询[聚合Group]

  • Group

为了方便我还是把我的表结构贴上来:


Group大约需要一下几个参数。

  1. key:用来分组文档的字段。和keyf两者必须有一个
  2. keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
  3. initial:reduce中使用变量的初始化
  4. reduce:执行的reduce函数。函数需要返回值。
  5. cond:执行过滤的条件。
  6. 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 ,完成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值