一.简介

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

  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. //根据条件查询
  2. blic T findOne(Query query,String collectionName);

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

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

第三步:实现测试方法

  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值相同的文档

  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. @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"));

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

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

实现测试方法

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

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

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

返回结果:

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

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

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

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

    一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

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

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

  3. MongoDB入门---文档查询操作之条件查询&and查询&or查询

    经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...

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

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

  5. Mongodb中 Documents文档说明

    mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: {    field1: value1,    field2: value2,    ...     ...

  6. Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***.

    Mongodb:修改文档结构后出现错误:Element '***' does not match any field or property of class ***. Mongodb是一种面向文档的 ...

  7. ES 父子文档查询

    父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...

  8. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

  9. mongodb内嵌文档的javaapi,增删改查

    数据结构: {"_id" : "000000001",  //Mongodb默认主键 "UID" : "000000001&quo ...

随机推荐

  1. 多目标遗传算法 ------ NSGA-II (部分源码解析)辅助变量 双链表操作 list.c

    /* A custom doubly linked list implemenation */ # include <stdio.h> # include <stdlib.h> ...

  2. linux系统下安装ruby环境

    1. 移除现有 Ruby 默认源 输入以下指令 $gem sources --remove https://rubygems.org/ 2. 使用新的源 输入以下指令 $gem sources -a  ...

  3. 序列化时提示There was an error reflecting type 'System.Collections.Generic.List`1

    序列化xml文件到List中,非win10下出现了这个错误,但是在win10下正常.经过仔细的研究,发现是序列化工具类不能使用Static.去掉Static即可.

  4. C# 比较不错的拓扑图控件

    群内有下载 616945527

  5. SQL——sql年龄段查询

    select * from 表 p where p.gender <> '男' ) ) select * ) ) 查询出所有年龄在15~49岁的非男性的信息

  6. 第16月底18天 phpstudy设置

    1.phpstudy设置-端口常规设置 E:\phpStudy\Apache\bin>httpd.exeAH00526: Syntax error on line 14 of E:/phpStu ...

  7. Java 学习札记(二)TomCat安装配置

    1.下载TomCat 下载地址:http://tomcat.apache.org/ 2.配置环境变量 CATALINA_HOME:F:\JAVA\apache-tomcat-6.0.18\apache ...

  8. mysql案例 ~ 主从复制延迟处理(3)

    一 简介:今天咱们来汇总下如何避免主从延迟 二 方案: 1 集群硬件配置统一,磁盘组更好(SSD最佳),更大的内存 2 linux系统+mysql的配置参数已经优化 3 mysql从库没有任何慢语句进 ...

  9. ActiveMQ集群

    1.ActiveMQ集群介绍 1.为什么要集群? 实现高可用,以排除单点故障引起的服务中断 实现负载均衡,以提升效率为更多客户提供服务 2.集群方式 客户端集群:让多个消费者消费同一个队列 Broke ...

  10. python 错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

    参照:http://www.runoob.com/django/django-form.html 做了个表单提交和回显,但是报了以上错误 查资料发现是 python从request取值的是unicod ...