一,问题描述

数据格式: id, timeStamp,count

条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime。比如 timeStamp BETWEEN 1499875200  AND 1499875600

条件2:记录 的 id 字段 属于某集合: id IN (1001,1002,1003)

条件3:记录 的count字段 大于某个阈值,比如: count > 10000

二,代码实现

条件1实现如下, $gte (greater equal)表示“大于等于 ”。【$lte(lower equal)】表示“小于等于”

    private DBObject timeCondi(long startTimeStamp, long endTimeStamp){
DBObject queryCondition = new BasicDBObject("$gte", startTimeStamp).append("$lte", endTimeStamp);
BasicDBObject query = new BasicDBObject("timeStamp", queryCondition);
return query;
}

条件2的实现如下,使用 $in ArrayList<Integer> 来表示 id IN (1001,1002,1003)

    private DBObject inCondi() {
List<Integer> idList = new ArrayList<Integer>();
idList.add(1001);
idList.add(1002);
idList.add(1003); BasicDBObject inQuery = new BasicDBObject();
inQuery.put("id", new BasicDBObject("$in", idList));
return inQuery;
}

组合条件1 和 条件2 查询:(条件1 AND 条件2).List 将所有 AND 组合的条件add进去,然后使用 $and 组合。

    private DBObject andQuery(long startTimeStamp, long endTimeStamp) {
DBObject timeCondi = timeCondi(startTimeStamp, endTimeStamp);
DBObject inCondi = inCondi(); List<DBObject> andCondi = new ArrayList<DBObject>();
andCondi.add(timeCondi);//组合 条件1
andCondi.add(inCondi);//组合 条件2 BasicDBObject andQuery = new BasicDBObject();
andQuery.put("$and", andCondi);
return andQuery;
}

条件3:记录 的count字段 大于某个阈值,比如: count > 10000

    private DBObject countCondi(int size) {
DBObject queryCondition = new BasicDBObject("$gte", size);
BasicDBObject query = new BasicDBObject("count", queryCondition);
return query;
}

WINDOWS下安装好MongoDB后,MongoDB采用Clietn--Server 模式。WIN10下启动MongoDB服务端:-dbpath 指定 数据存储目录(可自己指定一个)

D:\Program Files\MongoDB\Server\3.4\bin>.\mongod.exe -dbpath ..\data

另起一个 Cmd命令行,输入:

D:\Program Files\MongoDB\Server\3.4\bin>.\mongo.exe

就可以以Shell方式操作MongoDB了。

输入 exit 退出

D:\Program Files\MongoDB\Server\3.4\bin>netstat -ano | findstr 27017  查看端口是否开启

另外,推荐一个MongoDB的可视化工具:RoboMongoDB。执行相应的查询语句如下:

三,新版本MongoDB(3.0版本以上),使用Filters来组合多个条件

查询 timeStamp 在[startTimeStamp, endTimeStamp) 内的所有document

     private static Bson timeBetweenCondition(long startTimeStamp, long endTimeStamp) {
Bson condition = Filters.and(Filters.gte("timeStamp", startTimeStamp), Filters.lt("timeStamp", endTimeStamp));
return condition;
}

上面的示例,使用Filters的and方法连接了两个条件,其实还可以连接多个条件:比如查询 timeStamp 在[startTimeStamp, endTimeStamp) 区间内,并且 uid 在List<Long>uids 内的document

     private static Bson multipleAndCondition(long startTimeStamp, long endTimeStamp, List<Long> uids) {
Bson condition = Filters.and(Filters.gte("timeStamp", startTimeStamp), Filters.lt("timeStamp", endTimeStamp), Filters.in("uid", uids));
return condition;
}

Filters还组合了 IN 条件:比如,查询 uid 在[123, 456, 789]中,可用如下条件:

     private static Bson uidInCondition(List<Long> uids) {
Bson condition = Filters.in("uid", uids);
return condition;
}

具体更多的条件查询,可查看Filters的源代码。关于Filters的更多的用法可参考:Filters的若干使用示例

四,MongoDB查询时,过滤某些字段

使用Document对象来指定需要查询或者排除的字段。0 表示不返回该字段的值,1 表示返回该字段的值。

     //0 表示 不返回 该字段, 1 表示 返回该字段
private static Document fetchFields() {
Document fetchFields = new Document();
fetchFields.put("_id", 0);//查询的结果 不返回 _id 字段
fetchFields.put("uid", 1);//返回 uid 字段
fetchFields.put("chat", 1);//返回 chat 字段
return fetchFields;
}

然后再将 fetchFields 对象传入 project()方法即可,如下:

collection.find(timeBetweenCondition(startTimeStamp, endTimeStamp)).projection(fetchFields())

整个完整示例参考:

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.conversions.Bson; import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
//import static com.mongodb.client.model.Filters.*; /**
* Created by Administrator on 2017/10/20.
*/
public class MongoUtil {
private static final String HOST = "localhost";
private static final int PORT = 27017;
private static final String DB_NAME = "test";
private static final MongoClient mongoClient = new MongoClient(HOST, PORT);
private static MongoDatabase getDataBase() {
return mongoClient.getDatabase(DB_NAME);
} private static MongoCollection<Document> getCollection(String collName) {
return getDataBase().getCollection(collName);
} private static Bson timeBetweenCondition(long startTimeStamp, long endTimeStamp) {
Bson condition = Filters.and(Filters.gte("timeStamp", startTimeStamp), Filters.lt("timeStamp", endTimeStamp));
return condition;
} private static Bson uidInCondition(List<Long> uids) {
Bson condition = Filters.in("uid", uids);
return condition;
} private static Bson multipleAndCondition(long startTimeStamp, long endTimeStamp, List<Long> uids) {
Bson condition = Filters.and(Filters.gte("timeStamp", startTimeStamp), Filters.lt("timeStamp", endTimeStamp), Filters.in("uid", uids));
return condition;
} //0 表示 不抽取该字段, 1 表示 抽取该字段
private static Document fetchFields() {
Document fetchFields = new Document();
fetchFields.put("_id", 0);//查询的结果 不返回 _id 字段
fetchFields.put("uid", 1);//返回 uid 字段
fetchFields.put("chat", 1);//返回 chat 字段
return fetchFields;
} public static void main(String[] args) {
MongoCollection collection = getCollection("mycollection_name");
LocalDateTime today = LocalDateTime.of(2017, 8, 29, 0, 0, 0);
LocalDateTime tomorrow = today.plusDays(1); long startTimeStamp = today.atZone(ZoneId.systemDefault()).toEpochSecond();
long endTimeStamp = tomorrow.atZone(ZoneId.systemDefault()).toEpochSecond();
Bson andCondition = multipleAndCondition(startTimeStamp, endTimeStamp, Arrays.asList(65496L)); // Bson andCondition = timeBetweenCondition(startTimeStamp, endTimeStamp);
Document fetchFields = fetchFields();
MongoCursor<Document> cursor = collection.find(andCondition).projection(fetchFields).iterator(); long count = collection.count(andCondition);
System.out.println(count);
while (cursor.hasNext()) {
Document document = cursor.next();
String chat = (String) document.get("chat");
Long uid = (Long) document.get("uid");
System.out.println("chat:" + chat + ", uid:" + uid);
}
}
}

五:参考文献

https://www.mkyong.com/mongodb/java-mongodb-query-document/

http://farenda.com/mongodb/mongodb-filtering-sorting-and-projections/

原文:http://www.cnblogs.com/hapjin/p/7450309.html

MongoDB 组合多个条件查询($and、$in、$gte、$lte)的更多相关文章

  1. MongoDB 字符串值长度条件查询

    在实际项目中常常会有根据字段值长度大小进行限制查询,例如查询商品名称过长或过短的商品信息,具体的实现方式可能有多种,在此记录常见的两种实现 使用 $where 查询(性能稍逊一些) 1 2 3 4 5 ...

  2. mongodb将时间作为条件查询

    db.stock_signal_single.find({"createtime": { "$lt" : ISODate("2019-04-08T00 ...

  3. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  4. spring mvc 4.3.2 + mybatis 3.4.1 + mysql 5.7.14 +shiro 幼儿园收费系统 之 动态组合条件查询

    实际应用中,系统设计无法预料到用户最终的查询条件是怎样的.通常的做法是给出一些限制死的查询条件让用户查询.业务稍有改动,就要重新设计界面,增加查询字段等,费时费力. 比较好的做法是,除了常用的查询外, ...

  5. Mongodb 条件查询

    1.1 查询出所有数据的指定键(name ,age ,country) db.persons.find({},{name:1,age:1,country:1,_id:0}) 2.查询条件 2.查询条件 ...

  6. 【Mongodb教程 第十九课 】PHP与MONGODB的条件查询

    与普通的关系型数据库类似,在对数据的删.改.查的时候,会用到查询条件,如mysql中的 where… 而MongoDB中,经过php来做的所有的操作指令都是用array来包裹的: MongoColle ...

  7. mongodb复杂条件查询 (or与and)

    分类专栏: mongodb   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/tjbsl/ ...

  8. mongodb根据字符长度作为条件查询

    { $where:"this.XXX.length==2" } 用$where条件查询,等号要用==.虽说$where查询可能效率不是很好,这只是我能想到的,有更好的方法欢迎指教

  9. spring mongodb分页,动态条件、字段查询

    使用MongRepository public interface VideoRepository extends MongoRepository<Video, String> { Vid ...

随机推荐

  1. Web请求相关

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  2. 使用 gzexe 快速加密解密文件内容

    使用 gzexe 快速加密解密文件内容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用sshpass工具编写远程管理脚本 1>.安装依赖包 [root@node101 ...

  3. 老男孩Python全栈学习 S9 日常作业 001

    1.简述变量命名规范 必须以字母.数字.下划线命名,且不能以数字开头 不能是python的关键字 不能以中文或者拼音作为变量名 命名格式推荐以驼峰式或者下划线连接命名 区分大小写 要有意义,具有可描述 ...

  4. 老是上不了 google scholar...

    这段时间老是上不了 google scholar... 下载了最新的 host 也不行. 难道真是电脑有问题了? 网络有时也老是掉... 也好. 多休息休息. 人生难得几回清闲. 马上就要开学咯. 课 ...

  5. Mocha

    Mocha https://mochajs.org/#installation Mocha is a feature-rich JavaScript test framework running on ...

  6. react-router(v4) 路由跳转后返回页面顶部问题

    遇到的问题 由A页面跳转到B页面,B页面停留在A页面的位置,没有返回到顶部. 问题分析 首先分析下出现此问题的原因: 在项目中使用的是 hashHistory,它是建立在 history 之上的,当路 ...

  7. Java的三大特性

    一.封装性 含义:对外不可见,保护属性和方法不被外部多看见 实现:通过关键字private声明,用get.set方法为外部访问. 引用的传递: static关键字:修饰属性(全局属性):修饰方法(直接 ...

  8. 《Java编程思想第四版》第 16 章 设计范式-提到观察者模式

    在由Gamma,Helm 和 Johnson 编著的<Design Patterns>一书中被定义成一个“里程碑”.那本书列出了解决这个问题的 23 种不同的方法 16.1.2 范式分类 ...

  9. 菜鸟博客装饰分享CSS+HTML+js

    博客布局更改,各种百度,自己修改,搞成现在这样,有兴趣的朋友可以复制我下面的把自己博客覆盖了,然后在进行更改 不懂可加群问我:675678830 如果想开通打赏,用到js,需要在 下列中 博客侧边栏公 ...

  10. MVC ModelState.AddModelError使用

    cshtml:红色部分为使用方法  PostNextDay是 字段 <div id="postNextDay" class="col-xs-12 col-sm-6 ...