六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 9|回复: 0

java 操作mongoDB执行group by

[复制链接]

升级  40%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
20
 楼主| 发表于 2013-2-3 10:28:34 | 显示全部楼层 |阅读模式
最近公司要用Mongodb,学习了一下。
关于mongo的group by的用法有一个实例,写下来防止时间长了忘了。
具体的要求是要查询一段时间内消费的会员的总数,要求去重
表结构大致是
{user_id, ......, consume{    ....,    time,    ....  },...}

查询的结果集是
> db.consume.find({"consume.time.":{$gt:"0"}},{_id:0,user_id:1,"consume.time":1}).sort({"consuem.time":1}).limit(5);{ "consume" : { "time" : "1314583316" }, "user_id" : "34800268" }{ "consume" : { "time" : "1314583319" }, "user_id" : "67400937" }{ "consume" : { "time" : "1314583321" }, "user_id" : "130041511" }{ "consume" : { "time" : "1314583328" }, "user_id" : "4450046611" }{ "consume" : { "time" : "1314583336" }, "user_id" : "20036266" }

执行mongo的SQL大概是
db.consume.group({ key:{"user_id":true} ,cond:{"consume.time":{$gt:"1314583316",$lt:"1314583336"}},initial:{co:0},reduce:function(oj,pr){pr.co++}  } )

java代码是
DBCollection userSColl = MongoDBUtils.getDBCollection("consume");BasicDBObject key = new BasicDBObject("user_id",true);BasicDBObject cond = new BasicDBObject("consume.time",new BasicDBObject("$gt","1314583316").append("$lt", "1314583336"));BasicDBObject initial = new BasicDBObject("cou",0);String reduce = "function(obj,pre){pre.cou++}";BasicDBList returnList = (BasicDBList)userSColl.group(key, cond, initial, reduce);
然后去一下size

看了下mongo的doc发现还有
List list = userSColl.distinct("user_id", new BasicDBObject("consume.time",new BasicDBObject("$gt","1314583316").append("$lt", "1314583336")));

不过不知道有没有直接求出count的方法,研究下如果有再补上


参考文档是:http://www.mongodb.org/display/DOCS/Aggregation
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表