Welcome 微信登录

首页 / 数据库 / MySQL / MongoDB高级查询[聚合Group]

接上一篇... 见: http://www.linuxidc.com/Linux/2013-04/82787.htm
  • Group
为了方便我还是把我的表结构贴上来:和数据库一样group常常用于统计。MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]。 Group大约需要一下几个参数。
  1. key:用来分组文档的字段。和keyf两者必须有一个
  2. keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
  3. initial:reduce中使用变量的初始化
  4. reduce:执行的reduce函数。函数需要返回值。
  5. cond:执行过滤的条件。
  6. finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的
下面我用Java对他们做一些测试。我们以age年龄统计集合中存在的用户。Spring Schema和上次的一样。有了MongoTemplate对象我们可以做所有事的。以age统计用户测试代码如:@Test
    public void testGroupBy() throws Exception {
        String reduce = "function(doc, aggr){" +
                "            aggr.count += 1;" +
                "        }";
        Query query = Query.query(Criteria.where("age").exists(true));
        DBObject result = mongoTemplate.getCollection("person").group(new BasicDBObject("age", 1),
                query.getQueryObject(),
                new BasicDBObject("count", 0),
                reduce);
       
        Map map = result.toMap();
        System.out.println(map);
        for (Map.Entry o : map.entrySet()) {
            System.out.println(o.getKey() + "  " + o.getValue());
        }
    }key为new BasicDBObject("age", 1)cond为:Criteria.where("age").exists(true)。即用户中存在age字段的。initial为:new BasicDBObject("count", 0),即初始化reduce中人的个数为count为0。假如我们想在查询的时候给每个年龄的人增加10个假用户。我们只需要传入BasicDBObject("count", 10).reduce为:reduce的javascript函数上面的执行输出如:2  [age:23.0, count:1.0]
1  [age:25.0, count:1.0]
0  [age:24.0, count:1.0]前面的是一个序号,是Mongo的java-driver加上去的。我们可以看到结果在后面。
  • 1
  • 2
  • 下一页
MongoDB高级查询[聚合]ruby下MySQL的安装与配置相关资讯      MongoDB  MongoDB查询  MongoDB聚合 
  • MongoDB 聚合操作  (今 07:51)
  • MongoDB 3.3.0 发布下载  (01月14日)
  • 关于MongoDB按照字段模糊查询方法  (01月02日)
  • MongoDB 聚合  (03月24日)
  • MongoDB 3.2版WiredTiger存储引擎  (01月02日)
  • 使用MongoDB C#官方驱动操作  (12/31/2015 16:27:56)
本文评论 查看全部评论 (0)
表情: 姓名: 字数