如何在Java中对MongoDB按日期进行查询统计

        今天需要在MongoDB里做一个统计功能,同时要按日期进行过滤。查了很久都没有找到合适的资料,感觉相关资料太少了。经过苦逼地钻研,终于把问题搞定了。现归纳如下:

        MongoDB中的数据示例:


        方法一:通过构造BasicDBObject对象来进行查询

 
 

int startYear=2015,endYear=2016;
int startMonth=12,endMonth=1;
int startDay=1,endDay=1;
BasicDBObject query= new BasicDBObject("applydate", new BasicDBObject("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).append("$lt", new Date(endYear - 1900, endMonth -1, endDay)));//因为无法确知当前月有多少天,所以就从当月的1号(包含)计到下月1号(不包含)
int iCount = cltApplies.find(query).count();
System.out.println(iCount);

        经测试上述代码执行完毕后iCount为9。也就是在2016-1-1至2016-1-31期间有9条记录。
        方法二:通过BasicDBObjectBuilder对象来查询:

int startYear=2016,endYear=2016;
int startMonth=1,endMonth=2;
int startDay=1,endDay=1;
BasicDBObject query=  new BasicDBObject();
query.put("applydate", BasicDBObjectBuilder.start("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).add("$lt", new Date(endYear - 1900, endMonth - 1, endDay)).get());
int iCount = cltApplies.find(query).count();
System.out.println(iCount);

       上述代码执行后iCount同样为9。

       注意:因为java.util.Date(year,month,day)这个构造函数中year是超出1900的年数,所以需要减去1900;month从0开始,所以需要减去1。这个问题容易被初学者忽视。

       下面扩展地说一下如果要进行带日期过滤条件的统计,该如何做。

       前面的东西都相同,只是在统计的时候需要调用集合的distinct方法。如统计某个字段不重复的值有哪些,可用如下写法:

int startYear=2016,endYear=2016;
int startMonth=1,endMonth=2;
int startDay=1,endDay=1;
BasicDBObject query=  new BasicDBObject();
query.put("applydate", BasicDBObjectBuilder.start("$gte", new Date(startYear - 1900, startMonth - 1, startDay)).add("$lt", new Date(endYear - 1900, endMonth - 1, endDay)).get());
List<String> lstUserIds = cltApplies.distinct("userId", query);
System.out.println(lstUserIds.size());

       上面这段代码的执行结果为4。也就是在2016-1-1至2016-1-31之间出现了4个不同的userId。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值