本文以mongo-java-driver-3.5.0.jar为例

1 基本查询关键字(对应的sql语句):

MongoDB Aggregation Operators SQL Terms, Functions, and Concepts
$match WHERE/HAVING
$group GROUP BY
$project SELECT
$limit LIMIT
$sort (降序:-1 升序:1) ORDER BY (降序:DESC 升序:ASC默认)
$skip 跳过n个 持久化框架有接口
$sum SUM()/COUNT()
$in IN()
$nin NOT IN()
$or OR
$and AND
$regex 模糊查询 LIKE
$gt >
$gte >=
$lt <
$lte <=
$ne !=
=

2 构造复杂查询条件的3种方法:

2.1 测试数据

{ "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }
{ "_id" : { "$oid" : "59c9c1393471f5330c65ccd2" }, "name" : "nie", "password" : "nie", "nickname" : "nn", "iid" : 8 }
{ "_id" : { "$oid" : "59c9ec75a4e55c541a000003" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 8.0, "isRead" : false, "createTime" : { "$date" : 1506405705952 }, "money" : 88.88 }
{ "_id" : { "$oid" : "59b34277beca1aaeaf1d1fbe" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 3.0 }
{ "_id" : { "$oid" : "59b34282beca1aaeaf1d1fbf" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 4.0 }

2.3 实现构造复杂查询条件的3种方法:

public static MongoCollection<Document> connect() {  @SuppressWarnings("resource")  MongoClient client = new MongoClient("127.0.0.1", 27017);  MongoDatabase db = client.getDatabase("test");  MongoCollection<Document> collection = db.getCollection("user");  return collection;
} public static List<Document> findBy(Bson filter) {  List<Document> results = new ArrayList<Document>();  FindIterable<Document> iterables = connect().find(filter);  MongoCursor<Document> cursor = iterables.iterator();  while (cursor.hasNext()) {  results.add(cursor.next());  }  return results;
}
public static List<Document> findBy1(DBObject filter) {  List<Document> results = new ArrayList<Document>();  FindIterable<Document> iterables = connect().find((Bson) filter);  MongoCursor<Document> cursor = iterables.iterator();  while (cursor.hasNext()) {  results.add(cursor.next());  }  return results;
}  // 方法1:运用Filters.and添加复合条件;
@Test
public void testFindByLickQuery2(){  int iid = 2;String name = "yy";String nickname = "ygirl2";Bson filter = null;if (iid >= 0) {if (name != "") {if (nickname != "") {filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname), Filters.regex("name", name));} else {filter = Filters.and(Filters.gte("iid", iid), Filters.regex("name", name));}} else {if (nickname != "") {filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname));} else {filter = Filters.and(Filters.gte("iid", iid));}}} else {if (name != "") {if (nickname != "") {filter = Filters.and(Filters.eq("nickname", nickname), Filters.regex("name", name));} else {filter = Filters.and(Filters.regex("name", name));}} else {if (nickname != "") {filter = Filters.and(Filters.eq("nickname", nickname));} else {filter = Filters.and();}}}List<Document> results = findBy(filter);for(Document doc : results){  System.out.println(doc.toJson());  }  // { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }// { "_id" : { "$oid" : "59c9ec75a4e55c541a000003" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 8.0, "isRead" : false, "createTime" : { "$date" : 1506405705952 }, "money" : 88.88 }
}  // 方法2:运用Document filter.append添加复合条件;
@Test
public void testFindByLickQuery1(){  int iid = 3, iid2 = 4;String name = "";String nickname = "";Document filter = new Document(); if (iid >= 0) {filter.append("iid", new Document("$gte", iid));}// 得到iid<=4结果;// iid>=3条件被覆盖,Document.append不适合在同一个结果添加多个条件if (iid2 >= 0) {filter.append("iid", new Document("$lte", iid2));}if (name != "") {filter.append("name",new Document("$regex", name));}if (nickname != "") {filter.append("nickname",nickname);  }List<Document> results = findBy(filter); for(Document doc : results){  System.out.println(doc.toJson());  }  // { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }// { "_id" : { "$oid" : "59b34277beca1aaeaf1d1fbe" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 3.0 }// { "_id" : { "$oid" : "59b34282beca1aaeaf1d1fbf" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 4.0 }
} // 方法3:运用DBObject.put添加复合条件;
@Test
public void testFindByLickQuery1Copy(){  int iid = 3, iid2 = 4;String name = "";String nickname = "";DBObject filter = new BasicDBObject();  if (iid >= 0) {filter.put("iid", new BasicDBObject("$gte", iid));          }// 得到iid<=4结果;// iid>=3条件被覆盖,Document.append不适合在同一个结果添加多个条件if (iid2 >= 0) {if (iid >= 0) {BasicDBObject[] queryObjectAnd =  new BasicDBObject[] { new BasicDBObject("iid", new BasicDBObject("$gte", iid)),  new BasicDBObject("iid", new BasicDBObject("$lte", iid2)) };filter.put("$and", queryObjectAnd);} else {filter.put("iid",  new BasicDBObject("$lte", iid2)); }}if (name != "") {filter.put("name",new BasicDBObject("$regex", name));}if (nickname != "") {filter.put("nickname",nickname);  }List<Document> results = findBy1(filter); for(Document doc : results){  System.out.println(doc.toJson());  } // { "_id" : { "$oid" : "59b34277beca1aaeaf1d1fbe" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 3.0 }// { "_id" : { "$oid" : "59b34282beca1aaeaf1d1fbf" }, "name" : "yan", "password" : "ygirlyan", "nickname" : "ygirl2", "iid" : 4.0 }
} 

2.3 分析构造复杂查询条件的3种方法异同:

方法 实现 难易程度 能否给同一个字段加大于1个约束条件 适用于
方法1 Bson filter=Filters.and(Filters 1,…) 条件越多实现越困难,if-else越复杂 查询条件少且固定永远不变
方法2 Document f=append(key, v)
Document f=append(key, newBasicDBObject(“$gte”,v))
条件越多实现不会太困难 不能,后面的append条件会覆盖前面的 查询条件多且每个属性查询条件<=1
方法3 DBObject filter=put(“iid”,new BasicDBObject(“$gte”,v)); 条件越多实现不会太困难 适用于一切查询,特别适用于复杂条件查询应用

3 其他查询关键字应用:

3.1 String类型按条件聚合

@Test
public void testGroup() {/* Group操作*/  //DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("name", "$name").append("nickname", "$nickname"));  // 1 加入标志项_id,即聚合字段值;DBObject groupFields = new BasicDBObject("_id", "$name");  // 2 加入统计数count,即聚合个数;groupFields.put("count", new BasicDBObject("$sum", 1));  DBObject group = new BasicDBObject("$group", groupFields); // 排序操作  ,按count降序DBObject sortchBasicDBObjet = new BasicDBObject("$sort", new BasicDBObject("count",-1));  // 分页操作.skip(startRow),首先取2个记录,再跳过1个记录取出第二个记录显示出来;DBObject limitBasicDBObjet = new BasicDBObject("$limit",2); DBObject limitBasicDBObjet2 = new BasicDBObject("$skip",2);// project 操作  : 过滤查询显示字段个数,db.books.aggregate( [ { $project : { _id: 0, name : 1 , password : 1 }]);只显示name和password// DBObject projectBasicDBObjet = new BasicDBObject("$project", new BasicDBObject("_id",0).append("times", "$_id.times").append("user_id", "$_id.user_id").append("user_account", "$_id.user_account").append("count", 1));List<Bson> list = new ArrayList<Bson>();  list.add((Bson) group); list.add((Bson) sortchBasicDBObjet);  // $limit和$skip   add到list顺序不一样,结果不一样list.add((Bson) limitBasicDBObjet2);list.add((Bson) limitBasicDBObjet);  // list.add((Bson) limitBasicDBObjet2);List<Document> results = MongoDb.group(list);; for(Document doc : results){  System.out.println(doc.toJson());  }
}/** * isRead  "0"表示未读,"1"表示已读*/
public List<Object> findIfreadAlarmLog(String isRead, String CommunityName, String EQAddress) {MongoCollection<Document> collection = getMongodbCollection();// 添加统计统计//DBObject matchBasicDBObjet = new BasicDBObject("$match",new BasicDBObject("IsRead", "0"));DBObject queryCondition = new BasicDBObject();  queryCondition.put("IsRead", isRead);if (CommunityName != null && !"".equals(CommunityName)) {// 模糊匹配queryCondition.put("CommunityName", new BasicDBObject("$regex", CommunityName));}if (EQAddress != null && !"".equals(EQAddress)) {// 模糊匹配queryCondition.put("EQAddress", new BasicDBObject("$regex", EQAddress));}DBObject matchBasicDBObjet = new BasicDBObject("$match", queryCondition);// 添加统计条件DBObject groupFields = new BasicDBObject("_id", new BasicDBObject("CommunityID", "$CommunityID").append("CommunityName", "$CommunityName").append("EQName", "$EQName").append("EQAccount", "$EQAccount").append("EQAddress", "$EQAddress").append("Coordinate", "$Coordinate").append("SingleCoordinate", "$SingleCoordinate"));  // 加入统计数count,即聚合个数;groupFields.put("count", new BasicDBObject("$sum", 1));  DBObject group = new BasicDBObject("$group", groupFields); // 添加显示条件DBObject projectBasicDBObjet = new BasicDBObject("$project", new BasicDBObject("_id",0).append("CommunityID", "$_id.CommunityID").append("CommunityName", "$_id.CommunityName").append("EQName", "$_id.EQName").append("EQAccount", "$_id.EQAccount").append("EQAddress", "$_id.EQAddress").append("Coordinate", "$_id.Coordinate").append("SingleCoordinate", "$_id.SingleCoordinate").append("count", 1));List<Bson> list = new ArrayList<Bson>(); list.add((Bson) matchBasicDBObjet); list.add((Bson) group); list.add((Bson) projectBasicDBObjet); AggregateIterable<Document> iterables = collection.aggregate(list);       List<Object> results = new ArrayList<Object>();  MongoCursor<Document> cursor = iterables.iterator();  while (cursor.hasNext()) {  results.add(cursor.next());  }  return results;
}

3.2 json格式的查询

/** 先转换为Object再查询*/
public List<String> getHouseHouseAccounts(List<Object> singleCoords , String isRead) {MongoCollection<Document> collection = getMongodbCollection();DBObject queryCondition = new BasicDBObject();  List<String> resultArray = new ArrayList<String>();// 报错:org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class cn.com.vo.Point.,Point包含lng,lat属性// queryCondition.put("SingleCoordinate", JsonUtils.jsonToPojo(singleCoord, Point.class));// 返回空//queryCondition.put("SingleCoordinate", singleCoord);// 成功返回,(DBObject) JSON.parse(singleCoord)=JSON.parse(singleCoord)={ "lng" : 102.731653 , "lat" : 25.052474},88:H20170926000002     88:H20170926000003,H20170926000004//queryCondition.put("SingleCoordinate", JSON.parse(singleCoord));// 成功返回,JsonUtils.jsonToPojo(singleCoord, Object.class)={lng=102.731653, lat=25.052474},88:H20170926000002     88:H20170926000003,H20170926000004for (Object object : singleCoords) {//queryCondition.put("SingleCoordinate", JsonUtils.jsonToPojo(singleCoord, Object.class));queryCondition.put("SingleCoordinate", object);queryCondition.put("IsRead", isRead);List<Object> list = new ArrayList<Object>();FindIterable<Document> findIterable =collection.find((Bson) queryCondition);MongoCursor<Document> mongoCursor = findIterable.iterator();while(mongoCursor.hasNext()){  Document document=mongoCursor.next();list.add(document);         }  List<AlarmLog> alarmLogLists = JsonUtils.jsonToList(JsonUtils.objectToJson(list), AlarmLog.class);for (AlarmLog alarmLog : alarmLogLists) {resultArray.add("'" + alarmLog.getHouseAccount() + "'");}}//return StringUtils.collectionToDelimitedString(resultArray, ",");return resultArray;
}

3.3 $or和$and关键字查询

/*** Document  OR  AND 查询:db.user.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty();* 适合少条件且条件不变的查询,适合单字段多条件查询*/
@Test
public void testFindByOrAnd(){   // (查询iid等于2或者iid等于8的数据)  失败   只能查到8Document filter = new Document(); filter.append("iid", 2);filter.append("iid", 8);List<Document> results = MongoDb.findBy(filter);// $or (查询iid等于2或者iid等于8的数据)  BasicDBObject queryObjectOr = new BasicDBObject().append(  "$or",  new BasicDBObject[] { new BasicDBObject("iid", 2),  new BasicDBObject("iid", 8) }); // (查询iid等于2并且name等于nie的数据)   成功查出相应数据Document filter2 = new Document(); filter2.append("iid", 2);filter2.append("name", "yy");List<Document> results2 = MongoDb.findBy(filter2);// $and(查询iid等于2并且name等于nie的数据)  BasicDBObject queryObjectAnd = new BasicDBObject().append("$and",  new BasicDBObject[] { new BasicDBObject("iid", 2),  new BasicDBObject("name", "yy") });  List<Document> results3 = MongoDb.findBy(queryObjectOr); List<Document> results4 = MongoDb.findBy(queryObjectAnd);for(Document doc : results){  System.out.println(doc.toJson());  }  System.out.println("==========");  for(Document doc : results3){  System.out.println(doc.toJson());  }  System.out.println("==========");  for(Document doc : results4){  System.out.println(doc.toJson());  } System.out.println("==========");  for(Document doc : results2){  System.out.println(doc.toJson());  } // { "_id" : { "$oid" : "59c9c1393471f5330c65ccd2" }, "name" : "nie", "password" : "nie", "nickname" : "nn", "iid" : 8 }// { "_id" : { "$oid" : "59c9ec75a4e55c541a000003" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 8.0, "isRead" : false, "createTime" : { "$date" : 1506405705952 }, "money" : 88.88 }// ==========// { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }// { "_id" : { "$oid" : "59c9c1393471f5330c65ccd2" }, "name" : "nie", "password" : "nie", "nickname" : "nn", "iid" : 8 }// { "_id" : { "$oid" : "59c9ec75a4e55c541a000003" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 8.0, "isRead" : false, "createTime" : { "$date" : 1506405705952 }, "money" : 88.88 }// ==========// { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }// ==========// { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }}

3.4$in和$nin关键字查询

/*** Document  in  nin 查询*/
@Test
public void testFindByInNin(){   // $in  (查询iid为1和2的数据)BasicDBObject queryObjectIn = new BasicDBObject().append("iid", new BasicDBObject(  "$in", new int[] { 2, 8 })); // $nin  (查询iid不为1,2,3,4,5,6,7,8,9的数据)BasicDBObject queryObjectNin = new BasicDBObject().append("iid", new BasicDBObject("$nin", new int[] { 2, 9 })); List<Document> results3 = MongoDb.findBy(queryObjectIn); List<Document> results4 = MongoDb.findBy(queryObjectNin);for(Document doc : results3){  System.out.println(doc.toJson());  }  // { "_id" : { "$oid" : "59c8cbea6157d6c78dab4ff0" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 2 }// { "_id" : { "$oid" : "59c9c1393471f5330c65ccd2" }, "name" : "nie", "password" : "nie", "nickname" : "nn", "iid" : 8 }// { "_id" : { "$oid" : "59c9ec75a4e55c541a000003" }, "name" : "yy", "password" : "123", "nickname" : "ygirl2", "iid" : 8.0, "isRead" : false, "createTime" : { "$date" : 1506405705952 }, "money" : 88.88 }
}

Java通过mongo-java-driver-3.0+查询mongodb数据库相关推荐

  1. mongo go 查询指定字段_使用PyMongo查询MongoDB数据库!

    总览 我们将讨论如何使用PyMongo库查询MongoDB数据库. 我们将介绍MongoDB中的基本聚合操作. 介绍 随着互联网的全球普及,我们现在正在以前所未有的速度生成数据.因为执行任何类型的分析 ...

  2. pymongo查询列表元素_使用PyMongo查询MongoDB数据库!

    作者|LAKSHAY ARORA 编译|Flin 来源|analyticsvidhya 介绍 随着互联网的普及,我们现在正以前所未有的速度生成数据.因为执行任何类型的分析都需要我们从数据库中收集/查询 ...

  3. 方法:查询MongoDB数据库中最新一条数据(JAVA)

    使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...

  4. Java通过_id查询mongodb数据库

    本文以mongo-java-driver-3.5.0.jar为例 1 _id介绍: MongoDB中存储的文档必须有一个"_id"键,其对应的"_id"值是由M ...

  5. 如何在cmd下查询mongodb数据库

    首先我们要找到我们安装mongodb的文件夹下的bin文件夹,接下来在路径框中输入cmd进入命令行: 这样我们就可以进入命令行了 可以输入这些命令让你们查找相关的信息: 在这里插入代码片show db ...

  6. mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询

    数据操作是编程中避免不了的操作,这也就牵扯到了数据库的增删改查,而实际工作中我们最常用到的是增改查.今天要介绍的是Go 语言查询MongoDB数据库. 操作mongodb使用的包是"http ...

  7. Java连接SQL2005及SQL Server JDBC Driver 2.0中sqljdbc.jar和sqljdbc4.jar的区别

    第一.Java连接SQL2005 一.JAVA连接SQL的语句 JAVA连接SQL2000语句为: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver&q ...

  8. java me sdk_Java ME SDK 3.0不运行的问题及解决

    Java ME SDK 3.0不运行的问题及解决 最近想实现一个在自己手机上查询汉字拼音的程序,已经进行了大概20天了吧.但是上周的时候在Netbeans 6.8中运行程序,在输出中显示的是" ...

  9. mongo java client_mongodb java客户端的使用,即MongoClient

    Java 连接 MongoDB MongoDB 提供了一系列的驱动用于支持各种语言连接 mongodb 数据库,包括:Java,Python,C++,Scala,PHP 等,完整的驱动列表:https ...

最新文章

  1. R语言ggplot2可视化按照因子排序(order of facets)可视化分组多子图(facet、面图)实战
  2. 利用ASP.NET生成静态页面
  3. 怀旧服野外pvp最多的服务器,魔兽怀旧服:最想要去的服务器,野外PVP很“传统”,很欢乐!...
  4. 跨境电商自建站后台系统原型rp_Shoptago---跨境电商平台又一个新选择
  5. 《编译原理》第二章知识点
  6. 程序员才能看懂,看到第18张终于忍不住笑喷了。
  7. mysql: union / union all / 自定义函数用法详解
  8. 关于ASP.NET 中的主题
  9. HTML期末作业-旅游网页作业Html+css+Bootstarp
  10. 源码分析参考:Queue
  11. 2019福建省c语言知识点,2019最新C语言知识整理(干货)
  12. Hive数据导出的几种方式
  13. 大型网络游戏服务器的框架设计
  14. ex is not shell_我使用过的Linux命令之exit - 退出当前shell
  15. python模态窗口_python webdriver 对模态窗口的处理
  16. matlab 半方差分析,地统计学半方差分析几个名词含义说明
  17. 通信教程 | USB、HDMI、DP接口及速度
  18. Android实现通话呼叫转移与监听通话录音功能
  19. wince +C#拼音码形成代码
  20. 从零开始 CMake 学习笔记 (G)compile-flags

热门文章

  1. MODIS标准数据产品分级
  2. C++程序设计同步实践宝典——前言
  3. macOS SwiftUI 教程之 06 绘图实现正弦波,通过调整频率和步进值来更新正弦波视图 (教程含源码)
  4. flash制作游戏_如何使用Flash制作简单的装扮游戏
  5. 苹果开发者账号购买或续费支付表单填写全记录purchase form
  6. 幸运岛链LKC:打造全新的商业和经济体系,让区块链赋能商业经济
  7. 2022-2027年中国汽油市场规模现状及投资规划建议报告
  8. 盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?
  9. Instant Neural Graphics Primitives with a Multiresolution Hash Encoding 翻译
  10. 将Twitter4j与Scala结合使用以执行用户操作