一.简介

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. selenium_采集药品数据1_采集第一页表格

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  2. mysql常用sql汇总

    给一张表新增一个字段 ALTER table student add zz INT() DEFAULT COMMENT '0是授权 1未授权' 给表student 新增一个zz的字段 默认是0 后面是 ...

  3. git协同开发

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin. 要查看远程库的信息,用git remote: [root@w ...

  4. IDEA中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  5. PHP7 学习笔记(三)关于PHP7如何安装调试工具Xdebug扩展以及Zephir的问题

    前言: 1.自己摸索安装 2.快速安装 安装这个扩展是由于Zephir 编译不能始终通过,迫不得已啊,使用Zephir写扩展,总是出现以下错误: www@ubuntu1:~/phalcon-zephi ...

  6. Python基础-day02

    写在前面 上课第二天,打卡: 大人不华,君子务实. 一.进制相关 - 进制基础 数据存储在磁盘上或者内存中,都是以0.1形式存在的:即是以 二进制 的形式存在: 为了存储和展示,人们陆续扩展了数据的表 ...

  7. css/css3常用收集/笔记

    _______________________________________________________________  css3 瀑布流 N 列 <ul><li>aa ...

  8. jzoj4313 电话线铺设(最小生成树+最近公共祖先)

    题面 \(solution:\) 这道题很奇妙,需要对kruskal重构树有足够的了解!我们先对王牌电缆实行kruskal重构树,然后我们再来枚举每一条李牌电缆,我们将某一条李牌电缆加进这棵树中必然构 ...

  9. HashMap原理分析(JDK1.7.x之前)

    HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap<String,String&g ...

  10. 解决ipad连接不上电脑的问题

    检查一下信息: 1.iTunes是否安装 2.数据线是否完好 3.检查下图中的两个设备是否开启 4.最后一步是最恶心的:是否关闭了防火墙!!!! 操作步骤如下图示 我就是因为打开了防火墙,所以一直连接 ...