本文转自 Spring Data MongoDB 基本文档查询(Query、BasicQuery) ,仅做学习备份,如有侵权请联系博主删除!

Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我们介绍了对MongoDB的新增和删除, 今天我们要介绍Java代码实现对MongoDB实现查询操作。

我们回顾一下,我们在之前介绍了MongoDB的基本文档查询,MongoDB的查询语法:

db.orders.find({ {<field1>:<value1>,<field2>: <value2>, ... } },{field1:<boolean>, field2: <boolean> ... })

我们介绍是SpringData MongoDB 提供了find方法,方便我们通过java代码实现对MongoDB的查询操作:

mongoTemplate.find (query, entityClass)

参数说明:

entityClass:实体class,也就是要把文档转换成对应的实体。

query查询语句的实现的方式有两种:

1.org.springframework.data.mongodb.core.query

Query (Criteria criteria)

接受的参数是org.springframework.data.mongodb.core.query.Criteria

Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来,方便我们操作查询语句。

例如: 查询条件onumber="002"

mongoTemplate.find (new Query(Criteria.where("onumber").is("002")),entityClass)

多个条件组合查询时:

例如: onumber="002" and cname="zcy"

mongoTemplate.find (new Query(Criteria.where("onumber").is("002").and("cname").is("zcy")),entityClass)

例如: onumber="002" or cname="zcy"

mongoTemplate.findOne(newQuery(newCriteria().orOperator(Criteria.where("onumber").is("002"),Criteria.where("cname").is("zcy"))),entityClass);

我们通过Criteria的and方法,把这个条件组合一起查询

Criteria提供了很多方法,我们这边先介绍基本文档的查询操作符,对于数组文档或者内嵌文档的操作符,我们下一篇在介绍。

Criteria

Mongodb

说明

Criteria and (String key)

$and

并且

Criteria andOperator (Criteria…​ criteria)

$and

并且

Criteria orOperator (Criteria…​ criteria)

$or

或者

Criteria gt (Object o)

$gt

大于

Criteria gte (Object o)

$gte

大于等于

Criteria in (Object…​ o)

$in

包含

Criteria is (Object o)

$is

等于

Criteria lt (Object o)

$lt

小于

Criteria lte (Object o)

$lte

小等于

Criteria nin (Object…​ o)

$nin

不包含

。。。。。。。。。。。。。。

2、子类 org.springframework.data.mongodb.core.query.BasicQuery

BasicQuery(DBObject queryObject)

BasicQuery(DBObject queryObject, DBObject fieldsObject)

BasicQuery(java.lang.String query)

BasicQuery(java.lang.String query, java.lang.String fields)

DBObject就是转换成JSON格式,提供了 我们回顾一下,MongoDB查询时,

db.collection.find(query,projection),query类型是document,所以,我们想使用JSON字符串查询时,我们使用DBObject创建查询实例。

DBObject是接口,提供了几个子类,

1. BasicDBObject

BasicBSONObject extendsLinkedHashMap<String,Object> implements BSONObject

BasicDBObject extends BasicBSONObject implementsDBObject

例如:查询条件onumber="002"

DBObject obj = new BasicDBObject();

obj.put( "onumber","002" );

db.collect.find({"onumber":"002"})

2. BasicDBList

BasicBSONList extendsArrayList<Object> implements BSONObject

BasicDBList extends BasicBSONList implements DBObject

BasicDBList可以存放多个BasicDBObject条件

例如:我们查询onumber=002OR cname=zcy1

BasicDBList basicDBList= new BasicDBList();

basicDBList.add( new BasicDBObject( "onumber" , "002" ));

basicDBList.add( new BasicDBObject( "cname" , "zcy1" ));

DBObjectobj = new BasicDBObject();

obj.put( "$or" , basicDBList);

Query query= new BasicQuery(obj);

db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})

basicDBList.add方法是添加一个文档的查询条件

3. com.mongodb. QueryBuilder

QueryBuilder默认构造函数,是初始化BasicDBObject,QueryBuilder多个方法标准和查询连接起来,方便我们操作查询语句。跟Criteria是标准查询的接口一样,

QueryBuilder和BasicDBObject配合使用

QueryBuilder帮我们实现了  $and等操作符,我们查看部分的源代码:QueryBuilder部分的源代码:

  1. publicclassQueryBuilder {
  2. /**
  3. * Creates a builder with an empty query
  4. */
  5. publicQueryBuilder() {
  6. _query = new BasicDBObject();
  7. }
  8. publicQueryBuilder or( DBObject ... ors ){
  9. List l = (List)_query.get( "$or" );
  10. if ( l == null ){
  11. l = new ArrayList();
  12. _query.put( "$or" , l );
  13. }
  14. for ( DBObject o : ors )
  15. l.add( o );
  16. return this ;
  17. }
  18. /**
  19. * Equivalent to an $and operand
  20. * @param ands
  21. * @return
  22. */
  23. @SuppressWarnings ( "unchecked" )
  24. publicQueryBuilder and( DBObject ... ands ){
  25. List l = (List)_query.get( "$and" );
  26. if ( l == null ){
  27. l = new ArrayList();
  28. _query.put( "$and" , l );
  29. }
  30. for ( DBObject o : ands )
  31. l.add( o );
  32. return this ;
  33. }
接下来我们介绍查询的实现, Criteria提供了很多方法,我们这边就不在一个一个的操作符执行一遍,这跟 学习MongoDB 四: MongoDB查询(一) 基本文档的操作符介绍的一样。

二.findOne查询

findOne返回满足指定查询条件的文档,如果多个文档满足查询,该方法返回第一个文档,根据自然顺序返回文件在磁盘上的顺序,在覆盖的集合中,自然顺序与插入顺序相同。如果没找到对应的文档,会返回null。

mongoTemplate.findOne(query,entityClass)

1.      介绍接口以及方法的实现

我们在上一篇有介绍了 实现基本的添加 ,对整个结构有介绍了,我们这边就不在介绍了,直接介绍往里面添加方法

第一步:我们在基础接口MongoBase.java类新增一个findOne的接口

  1. /测试testFindOne方法添加
  2. @Test
  3. public void testFindOne() throws ParseException
  4. {
  5. Queryquery=newQuery(Criteria.where( "onumber" ).is( "002" ));
  6. Ordersorder=ordersDao.findOne(query,collectionName);
  7. System.out.println(JSONObject.fromObject(order));
  8. }
  1. > db.orders.find()
  2. { "_id" : ObjectId( "55b3ae9bee10ded9390d0b97" ), "_class" : "com.mongo.model.Orders" , "onumber" : "002" , "date" :ISODate( "2015-01-24T16:07:00Z" ), "cname" : "zcy1" , "items" : [ { "quantity" : 5, "price" : 4, "pnumber" : "p001" }, { "quantity" : 6, "price" : 8, "pnumber" : "p002" } ] }
  3. { "_id" : ObjectId( "55b3aea5ee10f970a2da7017" ), "_class" : "com.mongo.model.Orders" , "onumber" : "002" , "date" :ISODate( "2015-01-24T16:07:00Z" ), "cname" : "zcy2" , "items" : [ { "quantity" : 5, "price" : 4, "pnumber" : "p003" }, { "quantity" : 6, "price" : 8, "pnumber" : "p004" } ] }

我们执行findOne时查询条件为onumber=002,返回第一个记录

  1. { "cname" : "zcy1" , "date" { "date" :25, "day" :0, "hours" :0, "minutes" :7, "month" :0, "seconds" :0, "time" :1422115620000, "timezoneOffset" :-480, "year" :115}, "id" : "55b3ae9bee10ded9390d0b97" , "items" :[{ "pnumber" : "p001" , "price" :4, "quantity" :5},{ "pnumber" : "p002" , "price" :8, "quantity" :6}], "onumber" : "002" }

三.find查询

1.org.springframework.data.mongodb.core.query

Query (Criteria criteria)

接受的参数是org.springframework.data.mongodb.core.query.Criteria

例子:查询onumber="002" 并且cname="zcy"

OrdersDaoImpl类实现了find的方法

  1. @Test
  2. public void testFind() throws ParseException
  3. {
  4. Queryquery=newQuery(Criteria.where( "onumber" ).is( "002" ).and( "cname" ).is( "zcy1" ));
  5. List<Orders>orders=ordersDao.find(query,collectionName);
  6. System.out.println(JSONArray.fromObject(orders));
  7. }

我们查看转换成Query 时,是怎么样的,我们断点跟踪一下

会转换成对应的文档查询

查询的结果

  1. [{ "cname" : "zcy1" , "date" :{ "date" : 25 , "day" : 0 , "hours" : 0 , "minutes" : 7 , "month" : 0 , "seconds" : 0 , "time" : 1422115620000 , "timezoneOffset" :- 480 , "year" : 115 }, "id" : "55b3ae9bee10ded9390d0b97" , "items" :[{ "pnumber" : "p001" , "price" : 4 , "quantity" : 5 },{ "pnumber" : "p002" , "price" : 8 , "quantity" : 6 }], "onumber" : "002" }]

相当于MongoDB

b.orders.find({ "onumber" : "002" ,"cname" : "zcy1" })

还可以另外一种写法Criteria andOperator(Criteria…​ criteria)

Queryquery= new Query(Criteria. where ( "onumber" ).is( "002" ).andOperator(Criteria. where ( "cname" ).is( "zcy1" )));

一个Criteria中只能有一个andOperator,and可以多个,我们查询并列条件时,比较建议使用and方法。

2、org.springframework.data.mongodb.core.query.BasicQuery

BasicQuery(DBObject queryObject)

BasicQuery(DBObject queryObject, DBObject fieldsObject)

BasicQuery(java.lang.String query)

BasicQuery(java.lang.String query, java.lang.String fields)

例子:查询onumber="002" or cname="zcy"

OrdersDaoImpl类实现了find的方法

  1. public voidtestFind() throwsParseException
  2. {
  3. BasicDBListbasicDBList=newBasicDBList();
  4. basicDBList.add( new BasicDBObject( "onumber" , "002" ));
  5. basicDBList.add( new BasicDBObject( "cname" , "zcy1" ));
  6. DBObjectobj = newBasicDBObject();
  7. obj.put( "$or" , basicDBList);
  8. Queryquery=newBasicQuery(obj);
  9. List<Orders>orders=ordersDao.find(query,collectionName);
  10. System.out.println(JSONArray.fromObject(orders));
  11. }

查询的结果:

  1. [{ "cname" : "zcy1" , "date" :{ "date" :25, "day" :0, "hours" :0, "minutes" :7, "month" :0, "seconds" :0, "time" :1422115620000, "timezoneOffset" :-480, "year" :115}, "id" : "55bb9a3c27547f55fef9a10f" , "items" :[{ "pnumber" : "p001" , "price" :5, "quantity" :6},{ "pnumber" : "p002" , "price" :9, "quantity" :7}], "onumber" : "001" },
  1. { "cname" : "zcy1" , "date" :{ "date" :25, "day" :0, "hours" :0, "minutes" :7, "month" :0, "seconds" :0, "time" :1422115620000, "timezoneOffset" :-480, "year" :115}, "id" : "55bb9a2727544d40b95156e1" , "items" :[{ "pnumber" : "p001" , "price" :5, "quantity" :6},{ "pnumber" : "p002" , "price" :9, "quantity" :7}], "onumber" : "001" }]

相当于MongoDB

{ "$or" : [ { "onumber" :"002"} , { "cname" : "zcy1"}]}

QueryBuilder和BasicDBObject配合使用

QueryBuilder queryBuilder = new QueryBuilder();

queryBuilder .or( new BasicDBObject( "onumber" , "002" ), new BasicDBObject( "cname" , "zcy1" ));

Query query= new BasicQuery( queryBuilder .get());

四.find查询时指定返回的需要的字段

org.springframework.data.mongodb.core.query.BasicQuery提供了

BasicQuery(DBObject queryObject, DBObject fieldsObject)

BasicQuery(java.lang.String query, java.lang.String fields)

BasicQuery查询语句可以指定返回字段,构造函数

BasicQuery(DBObject queryObject, DBObject fieldsObject)

fieldsObject 这个字段可以指定返回字段

fieldsObject.put(key,value)

key:字段

value:

1或者true表示返回字段

0或者false表示不返回该字段

_id:默认就是1,没指定返回该字段时,默认会返回,除非设置为0是,就不会返回该字段。

指定返回字段,有时文档字段多并数据大时,我们指定返回我们需要的字段,这样既节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

  1. QueryBuilder queryBuilder = new QueryBuilder();
  2. queryBuilder.or( new BasicDBObject( "onumber" , "002" ), new BasicDBObject( "cname" , "zcy1" ));
  3. BasicDBObject fieldsObject= new BasicDBObject();
  4. fieldsObject.put( "onumber" , 1 );
  5. fieldsObject.put( "cname" , 1 );
  6. uery query= new BasicQuery(queryBuilder.get(),fieldsObject);

返回结果:

本文转自 Spring Data MongoDB 基本文档查询(Query、BasicQuery) ,仅做学习备份,如有侵权请联系博主删除!一.简介     Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我们介绍了对MongoDB的新增和
查看 Mongo DB数据库,集合里的主键_id有值。但是开发时Java代码中使用 mongo Template .findById(id, 实体.class, COLLECTION_NAME)和 mongo Template .findOne( query , 实体.class)时, 返回 的数据为null。数据库执行 查询 语句db.collection.find({"_id":2021080400123}) 发现也 返回 空值。 问题排查: 查看我的实体类定义 @Data @ToString @Accessors(chain = t
Spring Data Mongo DB提供了org.springframework.data. mongo db.core. Mongo Template Mongo DB的CRUD的操作,上一篇我们介绍了对 Mongo DB的新增和删除, 今天我们要介绍Java代码实现对 Mongo DB实现 查询 操作。      我们回顾一下,我们在之前介绍了 Mongo DB的基本文档 查询 ,Mon Query query = new Query (); // where...is... 相当于 where ? = ? query .addCriteria(Criteria.where("数据库表 字段 名").is("你的参数")); //分页 条件 query .skip(size*(page-1)).limit(size); // findOne 返回 的是一个对象 Class代表你的表对应的映射类 mongo Template .findOne( query , Class.class
这里写目录标题Spring boot集成 mongo db1、集成简介2、搭建开发环境2.1 初始化工程2.2 引入依赖2.3 添加配置3、基于 Mongo Template 开发CRUD3.1 添加实体3.2 实现3.3 添加测试类4、基于 Mongo Repository开发CRUD4.2 添加Repository类 Spring boot集成 mongo db 1、集成简介 spring-data- mongo db提供了 Mongo Template Mongo Repository两种方式访问 mongo db, Mongo Re
时隔俩月再次前来更新,太忙了。这次把从年前持续到现在的一个项目用到的 mongo db技术总结一下。陆陆续续遇到的坑和经验也放进来。 首先是技术选型上,我为啥选择使用 mongo db,而不是mysql? 这个完全是看业务场景,业务场景会导致数据的特殊性。我负责的内容管理部分。主要是存储用户和内容的交互数据。数据量比较大,而且都是新增动作,没有修改。且每条数据的 字段 如果是mysql,会存在很多varchar长度超过200,text的 字段 。所以选择使用 mongo db. 1.首先项目引入依赖
【探索人工智能的宝藏之地】 无论您是计算机相关专业的在校学生、老师,还是企业界的探索者,这个项目都是为您量身打造的。无论您是初入此领域的小白,还是寻求更高层次进阶的资深人士,这里都有您需要的宝藏。不仅如此,它还可以作为毕设项目、课程设计、作业、甚至项目初期的立项演示。 【人工智能的深度探索】 人工智能——模拟人类智能的技术和理论,使其在计算机上展现出类似人类的思考、判断、决策、学习和交流能力。这不仅是一门技术,更是一种前沿的科学探索。 【实战项目与源码分享】 我们深入探讨了深度学习的基本原理、神经网络的应用、自然语言处理、语言模型、文本分类、信息检索等领域。更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用这些资源,与我们一起在人工智能的海洋中航行。同时,我们也期待与您的沟通交流,共同学习,共同进步。让我们在这个充满挑战和机遇的领域中共同探索未来!
旅行商问题养老公寓-养老公寓系统-养老公寓系统源码-养老公寓管理系统-养老公寓管理系统java代码-养老公寓系统设计与实现-基于springboot的养老公寓系统-基于Web的养老公寓系统设计与实现-养老公寓网站-养老公寓网站代码-养老公寓平台-养老公寓平台代码-养老公寓项目-养老公寓项目代码-养老公寓代码 1、技术栈:java,springboot,vue,ajax,maven,mysql,MyBatisPlus等 开发语言:Java 框架:SpringBoot JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:SQLyog/Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器 2、系统的实现 摘 要 I 目 录 III 第1章 绪论 1 1.1选题动因 1 1.2背景与意义 1 第2章 相关技术介绍 3 2.1 MySQL数据库 3 2.2 Vue前端技术 3 2.3 B/S架构模式 4 2.4 ElementUI介绍 4 第3章 系统分析 5 3.1 可行性分析
【探索人工智能的宝藏之地】 无论您是计算机相关专业的在校学生、老师,还是企业界的探索者,这个项目都是为您量身打造的。无论您是初入此领域的小白,还是寻求更高层次进阶的资深人士,这里都有您需要的宝藏。不仅如此,它还可以作为毕设项目、课程设计、作业、甚至项目初期的立项演示。 【人工智能的深度探索】 人工智能——模拟人类智能的技术和理论,使其在计算机上展现出类似人类的思考、判断、决策、学习和交流能力。这不仅是一门技术,更是一种前沿的科学探索。 【实战项目与源码分享】 我们深入探讨了深度学习的基本原理、神经网络的应用、自然语言处理、语言模型、文本分类、信息检索等领域。更有深度学习、机器学习、自然语言处理和计算机视觉的实战项目源码,助您从理论走向实践,如果您已有一定基础,您可以基于这些源码进行修改和扩展,实现更多功能。 【期待与您同行】 我们真诚地邀请您下载并使用这些资源,与我们一起在人工智能的海洋中航行。同时,我们也期待与您的沟通交流,共同学习,共同进步。让我们在这个充满挑战和机遇的领域中共同探索未来! Query query = new Query (); query .fields().include("field1").include("field2"); List<Document> results = mongo Template .find( query , Document.class, "collectionName"); 在这个例子中,我们创建了一个 查询 对象` query `,并通过` query .fields()`方法 指定 要包含的 字段 。在这个例子中,我们 指定 了`field1`和`field2`两个 字段 。最后,我们使用` mongo Template .find()`方法执行 查询 指定 查询 的集合名称和 返回 的文档类型。 如果你想 查询 所有 字段 除了 指定 字段 ,可以使用`exclude()`方法。例如: ```java query .fields().exclude("field3"); 这将 查询 所有 字段 除了`field3` 字段