一.简单介绍

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是接口。提供了几个子类。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

我们比較常常使用的比較底层子类。扩展了自己的方法和继承父类,所以功能会比較多。

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的接口

            //依据条件查询
public T findOne(Query query,String collectionName);

第二步:我们在OrdersDaoImpl类加入一个详细findOne的实现方法

        @Override
public 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 时。是怎么样的,我们断点跟踪一下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

会转换成相应的文档查询

查询的结果

   [{"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);
Query 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)(一)的更多相关文章

  1. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  2. SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  3. Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...

  4. Spring Data MongoDB 四:基本文档改动(update)(一)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data  Mo ...

  5. Spring data mongodb 聚合,投射,内嵌数组文档分页.

    尽量别直接用 DBObject  ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...

  6. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  7. 如何在Spring Data MongoDB 中保存和查询动态字段

    原文: https://stackoverflow.com/questions/46466562/how-to-save-and-query-dynamic-fields-in-spring-data ...

  8. Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解

    先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...

  9. Spring Data MongoDB 分页查询

    在上篇文章 Spring Data MongoDB 环境搭建 基础上进行分页查询 定义公用分页参数类,实现 Pageable 接口 import java.io.Serializable; impor ...

随机推荐

  1. Linux新内核:提升系统性能 --Linux运维的博客

    http://blog.csdn.net/linuxnews/article/details/52864182

  2. 在EntityFramework6中管理DbContext的正确方式——1考虑的关键点(外文翻译)

    (译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...

  3. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据

    为了实现如图所示的树状结构图,并使列表项可拖动到盒子里,研究了ztree这个插件的使用,并仔细研究了列表项的拖动事件.完成了预期需求,对jQuery的运用得到了提高.这个插件的功能非常强大,除了基本的 ...

  4. NPOI读取Excel日期类型单元格返回一串数字问题

    public string getCellStringNEW(int row, int column) { try { ICell cell = xlSheet.GetRow(row).Cells[c ...

  5. pytest文档22-fixture详细介绍-作为参数传入,error和failed区别

    前言 fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手! fixture简介 fixture的目的是提供一个固定基线,在该基线上测 ...

  6. Myeclipse反编译插件(jad)的安装和使用

    在开发过程中我们肯定会遇到这样的问题,当我们调试程序的时候,走到一个地方发现引用了一个第三方的东西,点进去一看,会出现一下的画面,没有源代码!!!! 这让人很头疼,今天给大家介绍一个Myeclipse ...

  7. [runtime] iOS-Runtime-Headers

    Dynamically Generated iOS Headers https://github.com/nst/iOS-Runtime-Headers Here are iOS Objective- ...

  8. word排版汇总

    1.iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML.Html文件转化为PDF ...

  9. Android平台上优秀的开源项目

    软件名:gaeproxy 软件作用:Android手机配置GoAgent. 项目地址:https://github.com/madeye/gaeproxy.git 软件名:ProxyDroid 软件作 ...

  10. C# 编程指南

    此部分详细介绍了 C# 语言主要功能,以及通过 .NET Framework 可以在 C# 中使用的功能. 阅读此部分的大部分内容的前提是,你已对 C# 和一般编程概念有一定的了解. 如果完全没有接触 ...