SpringMVC 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部分的源代码:

[java]

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

[java]

  1. //根据条件查询
  2. blic T findOne(Query query,String collectionName);

第二步:我们在OrdersDaoImpl类添加一个具体findOne的实现方法

[java]

  1. @Override
  2. ublic Orders findOne(Query query, String collectionName) {
  3. return mongoTemplate.findOne(query, Orders.class, collectionName);

第三步:实现测试方法

[java]

  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. }

我们到MongoDB查询时,有两条onumber值相同的文档

[sql]

  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,返回第一个记录

[sql]

  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的方法

[java]

  1. @Override
  2. publicList<Orders> find(org.springframework.data.mongodb.core.query.Queryquery, String collectionName) {
  3. return mongoTemplate.find(query, Orders.class, collectionName);
  4. }

实现测试方法

Query query=new Query(Criteria.where("onumber").is("002").and("cname").is("zcy1"));

[java]

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

会转换成对应的文档查询

查询的结果

[java]

  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=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的方法

[java]

  1. @Override
  2. publicList<Orders> find(org.springframework.data.mongodb.core.query.BasicQueryquery, String collectionName) {
  3. returnmongoTemplate.find(query, Orders.class, collectionName);
  4. }

实现测试方法

[java]

  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. }

查询的结果:

[sql]

  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"},

[sql] view plain copy

  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= 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是,就不会返回该字段。

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

[java]

  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);

返回结果:

[java]

  1. [{"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个构造函数,在构造查询语句时,使用的是文档形式,方便我们对复杂查询的语句构造,而且还提供了指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。指定返回字段,有时文档字段多并数据大时,我们指定返回我们需要的字段,这样既节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

我们今天介绍了基本的文档操作,我们先了解怎么构造查询语句,并使用介绍了这两种方法,方便我们对查询的基本的理解,思路会更加清晰。

时间: 2024-10-22 14:05:43

SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”的相关文章

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>

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

Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简介 SpringData  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的find的操作,我们上一篇介绍了基本文档的查询,我们今天介绍分页查询,分页查询是返回到匹配文档的游标,可以随意修改查询限制.跳跃.和排序顺序的功能. 我

ES 父子文档查询

父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 update-mapping 时候确定好 PUT /company { "mappings": { "branch": {}, //父文档 type "employee": { "_parent": { "type&q

MongoDB实战-面向文档的数据(找到最合适的数据建模方式)

前一段时间一直研究通过Ruby操作MongoDB数据库,在学习的过程中也分享了自己学习成长的过程,撰写了包含两篇入门操作文章和十二篇进阶文章.本篇文章开始,我们将进入MongoDB的实战操作流程,MongoDB这一非关系型数据库-是一个文档型数据库,存储的是面向文档的数据. 如何在MongoDB数据库中使用schema 设计数据库schema是在已知数据库系统特性.数据本质以及应用程序需求的情况下为数据集选择最佳表述的过程.传统的关系型数据库RDBMS中鼓励使用正规化的数据模型,从而确保数据的可

向量空间模型实现文档查询(Vector space model to realise document query)

xml中文档(query)的结构: <topic> <number>CIRB010TopicZH006</number> <title>科索沃難民潮</title> <question> 查詢科索沃戰爭中的難民潮情況,以及國際間對其採取的援助. </question> <narrative> 相關文件內容包括科省難民湧入的地點.人數,受安置的狀況,難民潮引發的問題,參與救援之國家與國際組織,其援助策略與行動內容

mongodb 通过嵌入文档中的字段排序

mongodb中的全部数据: db.testInfo.find({}) .sort({_id:-1}) .limit(100) 查询结果: /* 1 createdAt:2019/10/11 下午5:12:50*/ { "_id" : ObjectId("5da04792665cd81dc0d46d3d"), "name" : "jim2", "age" : 5, "list" : [

Java-Object类、JDK_API文档查询

1.Object类 同java.lang包下的类,可以直接拿过来用 Object类的方法: 1)toString方法 2.下载API文档 http://java.sun.com,下载Java SE document,解压下载的压缩包,就可以查看API文档了.

MongoDB快速入门学习笔记4 MongoDB的文档查询操作

先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "name" : "zhangsan", "age": 27, "sex": 1 }, { "_id" : 2, "name" : "lisi", "age":

mongodb二进制安装文档

二进制包下载地址:https://www.mongodb.org/dl/linux tar xf mongodb-linux-x86_64-3.0.5.tgz -C/usr/local/ mv /usr/local/mongodb-linux-x86_64-3.0.5  /usr/local/mongodb mkdir /usr/local/mongodb/data touch /usr/local/mongodb/logs groupadd mongodb useradd -g mongodb