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 =newBasicDBObject();
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部分的源代码:
- publicclassQueryBuilder {
- /**
- * Creates a builder with an empty query
- */
- publicQueryBuilder() {
- _query = new BasicDBObject();
- }
- publicQueryBuilder or( DBObject ... ors ){
- List l = (List)_query.get( "$or" );
- if ( l == null ){
- l = new ArrayList();
- _query.put( "$or" , l );
- }
- for ( DBObject o : ors )
- l.add( o );
- return this;
- }
- /**
- * Equivalent to an $and operand
- * @param ands
- * @return
- */
- @SuppressWarnings("unchecked")
- publicQueryBuilder and( DBObject ... ands ){
- List l = (List)_query.get( "$and" );
- if ( l == null ){
- l = new ArrayList();
- _query.put( "$and" , l );
- }
- for ( DBObject o : ands )
- l.add( o );
- return this;
- }
接下来我们介绍查询的实现,Criteria提供了很多方法,我们这边就不在一个一个的操作符执行一遍,这跟学习MongoDB 四: MongoDB查询(一)基本文档的操作符介绍的一样。
二.findOne查询
findOne返回满足指定查询条件的文档,如果多个文档满足查询,该方法返回第一个文档,根据自然顺序返回文件在磁盘上的顺序,在覆盖的集合中,自然顺序与插入顺序相同。如果没找到对应的文档,会返回null。
方法:
mongoTemplate.findOne(query,entityClass)
1. 介绍接口以及方法的实现
我们在上一篇有介绍了实现基本的添加,对整个结构有介绍了,我们这边就不在介绍了,直接介绍往里面添加方法
第一步:我们在基础接口MongoBase.java类新增一个findOne的接口
- //根据条件查询
- blic T findOne(Query query,String collectionName);
第二步:我们在OrdersDaoImpl类添加一个具体findOne的实现方法
- @Override
- ublic Orders findOne(Query query, String collectionName) {
- return mongoTemplate.findOne(query, Orders.class, collectionName);
第三步:实现测试方法
- /测试testFindOne方法添加
- @Test
- public void testFindOne() throws ParseException
- {
- Queryquery=newQuery(Criteria.where("onumber").is("002"));
- Ordersorder=ordersDao.findOne(query,collectionName);
- System.out.println(JSONObject.fromObject(order));
- }
我们到MongoDB查询时,有两条onumber值相同的文档
- > db.orders.find()
- { "_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" } ] }
- { "_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,返回第一个记录
- {"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的方法
- @Override
- publicList<Orders> find(org.springframework.data.mongodb.core.query.Queryquery, String collectionName) {
- return mongoTemplate.find(query, Orders.class, collectionName);
- }
实现测试方法
Query query=new Query(Criteria.where("onumber").is("002").and("cname").is("zcy1"));
- @Test
- public void testFind() throws ParseException
- {
- Queryquery=newQuery(Criteria.where("onumber").is("002").and("cname").is("zcy1"));
- List<Orders>orders=ordersDao.find(query,collectionName);
- System.out.println(JSONArray.fromObject(orders));
- }
我们查看转换成Query 时,是怎么样的,我们断点跟踪一下
会转换成对应的文档查询
查询的结果
- [{"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=newQuery(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的方法
- @Override
- publicList<Orders> find(org.springframework.data.mongodb.core.query.BasicQueryquery, String collectionName) {
- returnmongoTemplate.find(query, Orders.class, collectionName);
- }
实现测试方法
- public voidtestFind() throwsParseException
- {
- BasicDBListbasicDBList=newBasicDBList();
- basicDBList.add(new BasicDBObject("onumber","002"));
- basicDBList.add(new BasicDBObject("cname","zcy1"));
- DBObjectobj = newBasicDBObject();
- obj.put("$or", basicDBList);
- Queryquery=newBasicQuery(obj);
- List<Orders>orders=ordersDao.find(query,collectionName);
- System.out.println(JSONArray.fromObject(orders));
- }
查询的结果:
- [{"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"},
- {"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= newQueryBuilder();
queryBuilder.or(new BasicDBObject("onumber","002"),newBasicDBObject("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是,就不会返回该字段。
指定返回字段,有时文档字段多并数据大时,我们指定返回我们需要的字段,这样既节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。
- QueryBuilder queryBuilder = new QueryBuilder();
- queryBuilder.or(new BasicDBObject("onumber", "002"), new BasicDBObject("cname","zcy1"));
- BasicDBObject fieldsObject=new BasicDBObject();
- fieldsObject.put("onumber", 1);
- fieldsObject.put("cname", 1);
- uery query=new BasicQuery(queryBuilder.get(),fieldsObject);
返回结果:
- [{"cname":"zcy1","date":null,"id":"55bb9a3c27547f55fef9a10f","items":[],"onumber":"001"},{"cname":"zcy1","date":null,"id":"55bb9a2727544d40b95156e1","items":[],"onumber":"001"}]
相当于MongoDB
db.orders.find({"$or" : [ { "onumber" : "002"} , {"cname" : "zcy1"}]},{"onumber":1,"cname":1})
总结:
我们经常比较使用的是org.springframework.data.mongodb.core.query.BasicQuery,首先提供了4个构造函数,在构造查询语句时,使用的是文档形式,方便我们对复杂查询的语句构造,而且还提供了指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。指定返回字段,有时文档字段多并数据大时,我们指定返回我们需要的字段,这样既节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。
我们今天介绍了基本的文档操作,我们先了解怎么构造查询语句,并使用介绍了这两种方法,方便我们对查询的基本的理解,思路会更加清晰。
Spring Data MongoDB 三:基本文档查询(Query、BasicQuery的更多相关文章
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
一.简单介绍 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...
- SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”
一.简介 spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...
- Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)
Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...
- Spring Data MongoDB 四:基本文档改动(update)(一)
Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data Mo ...
- Spring data mongodb 聚合,投射,内嵌数组文档分页.
尽量别直接用 DBObject ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- 如何在Spring Data MongoDB 中保存和查询动态字段
原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...
- Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解
先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...
- Spring Data MongoDB 分页查询
在上篇文章 Spring Data MongoDB 环境搭建 基础上进行分页查询 定义公用分页参数类,实现 Pageable 接口 import java.io.Serializable; impor ...
随机推荐
- python爬虫入门(2)re模块-正则表达式
正则表达式 search //匹配第一次遇到符合规则的 匹配IP地址 import re re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3 ...
- librec库
固定初始化矩阵值 net.librec.math.structure -> class DenseMatrix -> void init()
- MPI 学习
一.编译MPI mpic++ test.cc -o test 二.启动MPI mpiexec -np 10 ./test 三.几个例子 第一个进程向第二个发一个数,第二个进程向第三个进程发送一个数.. ...
- selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能
最近在UI自动化时遇到了,上一步成功操作后没有响应的情况(动画加载和浏览器加载导致实际没有问题),导致下一步无法成功操作,所有想在尝试2次操作后再次进行上一步操作解决这种情况导致的错误(其实是不想每一 ...
- openresty websocket 使用
openresty websocket 使用 1. 代码如下: local server =require"resty.websocket.server" local wb, ...
- HTTP 协议小结
本篇博客来自前辈整理资料的学习之作,若有冒犯,敬请谅解!原文博客已删除,转载篇:HTTP协议详解 1,HTTP特点 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于 ...
- db_recovery_file_dest_size 修改大一点及删除归档日志 |转|
今天给客户测 试问题,让客户把数据发过来了.解压缩后一看,他们还是用的oracle 815版本的(他们exp导出时,带了导出日志,从导出日志中看出来是oracle 815版本的),不过没有关系,低版本 ...
- angular指令,异步调用数据,监控数据的变化(自定义一个表头的指令)
angular框架中提供了很多有效的指令,指令的目的就是为了提高代码的复用率,提高工作效率. 下面我们自己来定义一个指令: 一点建议:写指令名字的时候,尽量不要用用大写,下划线等,否则会有很大的坑等着 ...
- DataOutput接口实现类有:
FSDataOutputStream final FSDataOutputStream create = fs.create(path);
- nagios(centreon)监控Linux日志
1 将check_log3.pl下载后放到客户端服务器的插件文件夹[root@SSAVL2475 libexec]# cp /tmp/check_log3.pl /usr/local/nagios/ ...