Home  >  Article  >  Database  >  MongoDB高级查询[聚合Group]

MongoDB高级查询[聚合Group]

WBOY
WBOYOriginal
2016-06-07 17:28:011156browse

接上一篇... 见: http://www.linuxidc.com/Linux/2013-04/82787.htm Group 为了方便我还是把我的表结构贴上来: 和数据库一样g

接上一篇... 见: 

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

    和数据库一样group常常用于统计。MongoDB的group还有很多限制,如:返回结果集不能超过16M,, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]。

     

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

    下面我用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());
            }
        }

    keynew BasicDBObject("age", 1)

    cond为:Criteria.where("age").exists(true)。即用户中存在age字段的。

    initial为:new BasicDBObject("count", 0),即初始化reduce中人的个数为count0。假如我们想在查询的时候给每个年龄的人增加10个假用户。我们只需要传入BasicDBObject("count", 10).

    reduce为:reducejavascript函数

    上面的执行输出如:

    2  [age:23.0, count:1.0]
    1  [age:25.0, count:1.0]
    0  [age:24.0, count:1.0]

    前面的是一个序号,是Mongo的java-driver加上去的。我们可以看到结果在后面。

    linux

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn