一,问题描述

数据格式: 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(greaterequal)表示“大于等于”。【gte(greaterequal)表示“大于等于”。【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);//组合 条件1andCondi.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

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

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

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

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

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

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

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

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

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

然后再将 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/

本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/7450309.html,如需转载请自行联系原作者

MongoDB 组合多个条件查询(and、and、in、gte、gte、lte)相关推荐

  1. MongoDB 组合多个条件查询(and、in、gte、lte)

    一,问题描述 数据格式: id, timeStamp,count 条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime.比如 timeS ...

  2. java mongodb $in_MongoDB 组合多个条件查询($and、$in、$gte、$lte)

    一,问题描述 数据格式: id, timeStamp,count 条件1:查询 某个时间段 内的数据: timeStamp BETWEEN startTime AND endTime.比如 timeS ...

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

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

  4. mongodb java 多条件查询_MongoDB_Java连接mongo 使用Java多条件查询mongo数据

    在mongo shell中的查询语句是这样的.. db.user.find({"age":{"$gt":5,"$lt":14}})我们用Ja ...

  5. php中条件查询语句,thinkphp3.2框架中where条件查询用法总结

    本文实例讲述了thinkphp3.2框架中where条件查询用法.分享给大家供大家参考,具体如下: thinkphp3.2 where 条件查询 在连贯操作中条件where的操作有时候自己很晕,所以整 ...

  6. MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate

    MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎. 1.常用命令 show databases:显示数据库列表 use:切换数据库 ...

  7. mongodb java 多条件查询_MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)...

    MongoDB查询之高级操作 语法介绍 MongoDB查询文档使用find()方法,同时find()方法以非结构化的方式来显示所有查询到的文档. -- 1.基本语法 db.collection.fin ...

  8. MongoDB自定义条件查询案例

    MongoDB自定义条件查询案例

  9. 01.query的分类-条件查询和组合查询

    文章目录 1. es单个条件查询和组合查询 2.query和filter context 1. query context 2. filter context 3.使用样例 1. es单个条件查询和组 ...

最新文章

  1. 数据通信技术(十:OSPF特殊区域TOTALLY STUB配置(ZTE))
  2. 朱晔的互联网架构实践心得S1E2:屡试不爽的架构三马车
  3. python字符串写入excel-python 操作 Excel 之写入
  4. 十大场景带你玩转外国
  5. 字符串切割(split())
  6. Markdown简介和基本语法
  7. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
  8. 前端抱怨API响应慢,怎么办?
  9. 软件系统设计-13-质量属性
  10. 修改网课播放器倍速播放
  11. python set集合排序_Python Set集合
  12. 第5关:类与对象练习------Java面向对象 - 类与对象
  13. [Pytorch系列-57]:循环神经网络 - gensim.models.word2vec参数详解与构建词向量模型
  14. Python数据可视化案例:分析微信公众号数据
  15. 一个数据分析师的职业规划:人生本来就应该提前做好准备
  16. 大厂Offer拿到手软啊!隔壁都馋哭了
  17. Go Web快速开发框架 Fiber
  18. 人工智能定义的 IT 基础设施浅析
  19. 在国内,如何优雅的使用ChatGPT??
  20. 在浏览器中嵌入播放器

热门文章

  1. 爬虫虎牙网站lol主播人气和姓名(附人气值排名新方法)
  2. Adobe Photoshop CC 2018图文安装教程,附下载地址
  3. MySQL常用数据库引擎
  4. 那你说我们需要专职的QA吗?(陈老师,你是我的偶像 大师级人物)
  5. 宝宝看画APP技术支持
  6. CSS 垂直居中的正确打开方式
  7. 各大名企的笔试面试题
  8. OpenAi使用心得(注册+聊天+CodeX+图片+对接api)
  9. iOS开发 iap、GameCenter、iCloud、Passbook系统服务开发调用
  10. JMeter 教程 网盘下载