mongodb复杂查询

mongodb复杂查询(基于mapreduce)http://blog.jobbole.com/80619/

最近想用mongodb实现一个类似于sql(select sum(xx) from table group by xxx)的东西。上数据:

phonecontentsize
12345678901测试122
12345678901测试1
12345678902测试1233
12345678902测试12
12345678902测试22
12345678902测试1
12345678902测试1
12345678903测试1


sql语句
 select sum(size) from table_name group by phone 

js(mapreduce)注:reduce函数返回结果数据结构必须和map函数value的数据结构一致。因为reduce函数会将自己的返回值再次作为下一次reduce的输入值使用。

map:
    function() {
            ###total:自定义(作为json的key)
            emit(phone,{total:this.size});
        }
reduce:
    function(key,values) {
            var sum = {total:0};
            for (var i=0;i<values.length;i++){  
                ###sum.total相当于total对应的值(size)                         
                sum.total +=  values[i].total; 
            }
            ###sum的数据结构必须和map函数的value的结构一致
                return sum;
        }
spring-mongodb实现(mapreduce)
 <mongo:mongo id="mongo" host="${db.mongoAddress}" port="${db.mongoPort}"/>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongo"/>
        <constructor-arg name="databaseName" value="${db.mongoName}"/>
        <constructor-arg name="userCredentials" ref="userCredentials"/>
    </bean>

    <bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials">
        <constructor-arg name="username" value="${db.mongoUsername}"/>
        <constructor-arg name="password" value="${db.mongoPassword}"/>
    </bean>
//map函数
String m ="function() {"+
            "emit(phone,{total:this.size});"+
        "}";
//reduce函数
        String r = "function(key,values) {"+
                "var sum = {total:0};"+
                "for (var i=0;i<values.length;i++){" +
                "sum.total += values[i].total;" +
                "}"+
                "return sum;"+
                "}";

        MapReduceResults persons = mongoTemplate.mapReduce("connection_", m, r, null);
        BasicDBList list = (BasicDBList) persons.getRawResults().get("results");
        for (int i = 0; i < list.size(); i ++) {
            BasicDBObject obj = (BasicDBObject)list.get(i);
            Object o = obj.get("value");
          System.out.println(JSON.toJSONString(obj));
        }

测试结果

phonesize
123456789013
123456789029
123456789031
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值