当前位置:Gxlcms > 数据库问题 > SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

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

时间:2021-07-01 10:21:17 帮助过:21人阅读

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

     

    [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.       
    6.      Queryquery=newQuery(Criteria.where("onumber").is("002"));  
    7.      Ordersorder=ordersDao.findOne(query,collectionName);  
    8.      System.out.println(JSONObject.fromObject(order));  
    9.       
    10.   }  

     

     

     

       我们到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.        
    4.       BasicDBListbasicDBList=newBasicDBList();  
    5.        
    6.       basicDBList.add(new BasicDBObject("onumber","002"));  
    7.       basicDBList.add(new BasicDBObject("cname","zcy1"));  
    8.       DBObjectobj = newBasicDBObject();  
    9.       obj.put("$or", basicDBList);  
    10.       Queryquery=newBasicQuery(obj);  
    11.       List<Orders>orders=ordersDao.find(query,collectionName);  
    12.       System.out.println(JSONArray.fromObject(orders));  
    13.    }  

     

     

       查询的结果:

           

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

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

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

    标签:分享   删除   tail   time   one   rri   warning   anti   格式   

    人气教程排行