美文网首页
【原创】【译】MongoDB 3.0.6查询数据

【原创】【译】MongoDB 3.0.6查询数据

作者: detry | 来源:发表于2015-10-03 07:36 被阅读2441次

    概述

    在MongoDB中,你可以用查询 find 方法来从一个集合中查询数据。MongoDB的所有查询都是单个集合范围内。

    查询能返回集合中的所有文档,或者是最符合条件的文档。你可以用
    org.bson.Document里的find方法,传入参数查询。

    该 find方法用FindIterable(生成文档的迭代对象)来返回一个查询结果。

    预备条件

    该例子仍然使用test数据库中的restaurant集合。关于导入数据集的相关操作,请看之前的博文。


    紧跟着之前的操作,从连接数据库,到运行MongoDB,到创建test数据库和restaurant集合。
    我们需要导入以下的包:

         import org.bson.Document;
    
         import com.mongodb.Block;
         import com.mongodb.client.FindIterable;
         import static com.mongodb.client.model.Filters.*;
         import static com.mongodb.client.model.Sorts.ascending;
         import static java.util.Arrays.asList;
    

    在一个集合中查询所有的文档

    为了查询出所有的文档,我们在find方法中不需要传入任何条件。例如,以下的操作就能返回restaurant集合中的所有文档:

         FindIterable<Document> iterable = db.getCollection("restaurants").find();
    

    迭代结果集,并用块(block)运用到每个文档:

         iterable.forEach(new Block<Document>() { 
    
              @Override public void apply(final Document document) { 
                    System.out.println(document); }
            });
    

    该结果集包含了restaurant里的所有文档。


    指定平等条件

    用MongoDB提供的Java驱动包来实现平等条件查询,例如:

           new Document( <field>, <value> )
    

    如果<field>是一个内嵌的文档或者数组,用.点符号来访问。
    为了定制查询条件,MongoDB的Java驱动包提供了 Filter类。该类包含各种静态方法来简化查询操作,例如下面的 eq方法:

         eq(<field>, <value>)
    

    通过顶级域查询

    以下操作查询 borough为 “Manhattan”的文档。

         FindIterable<Document> iterable = 
    
              db.getCollection("restaurants").find( 
                      new Document("borough", "Manhattan"));
    

    迭代结果集,并用块(block)运用到每个文档:

         iterable.forEach(new Block<Document>() { 
    
              @Override public void apply(final Document document) { 
                    System.out.println(document); }
            });
    

    利用 Filter类提供的静态方法,你还可以这么做:

       db.getCollection("restaurants").find(eq("borough", "Manhattan"));
    

    用嵌入式文档查询字段

    为了在带有嵌入式文档的域中明确查询条件,我们使用点记法。点记法需要传入整个全限定名,以下操作指定查询在address域里的zipcode嵌入文档。

           FindIterable<Document> iterable = 
    
                db.getCollection("restaurants").find( 
                        new Document("address.zipcode", "10075"));
    

    迭代结果集:

           iterable.forEach(new Block<Document>() {
    
                   @Override public void apply(final Document document) {                       
                          System.out.println(document); 
             }});
    

    或者用Filter类的静态方法,还可以这么做:

         db.getCollection("restaurants").find(eq("address.zipcode", "10075"));
    

    更多关于带有嵌入文档的查询,请看Embedded Documents


    数组中的域查询

    grade数组包括很多嵌入的文档。要明确查询条件,我们用点记法。
    点记法仍然需要我们传入整个全限定名,以下操作是获得grade为B的结果集。

       FindIterable<Document> iterable = 
    
              db.getCollection("restaurants").find(
                 new Document("grades.grade", "B"));
    

    迭代结果:

           iterable.forEach(new Block<Document>() { 
    
                  @Override 
                  public void apply(final Document document) { 
                          System.out.println(document);
             }});
    

    或者可以用Filter类提供的静态方法,

         db.getCollection("restaurants").find(eq("grades.grade", "B"));
    

    更多关于数组的查询,请看Arrays


    明确条件的操作

    MongoDB提供明确条件的查询,例如比较操作Comparison Query Operators,尽管还有一些比如or和and操作,这些操作的大致都有以下格式:

             new Document( <field>, new Document( <operator>, <value> ) )
    

    为了明确查询条件,MongoDB的Java驱动包提供了Filter类提供很多静态方法建立查询,其中包括lt(less than)和gt(greater than)等:

       lt(<field>, <value>)
    
       gt(<field>, <value>)
    

    gt的操作:

       FindIterable<Document> iterable = 
    
              db.getCollection("restaurants").find( 
                  new Document("grades.score", new Document("$gt", 30)));
    

    然后迭代结果集:

       iterable.forEach(new Block<Document>() { 
    
                @Override 
                public void apply(final Document document) { 
                    System.out.println(document); 
          }});
    

    或者可以用Filter类提供的静态方法:

       db.getCollection("restaurants").find(gt("grades.score", 30));
    

    lt的操作

    我们查询出grade里score小于10的结果集:

         FindIterable<Document> iterable = 
    
                db.getCollection("restaurants").find( 
                  new Document("grades.score", new Document("$lt", 10)));
    

    迭代出结果集:

         iterable.forEach(new Block<Document>() { 
    
                  @Override 
                  public void apply(final Document document) { 
                        System.out.println(document); 
           }});
    

    或者可以用Filter类提供的静态方法:

         db.getCollection("restaurants").find(lt("grades.score", 10));
    

    联合查询

    你可以用逻辑连接词 and或者 or来构建联合查询。
    逻辑词 and
    你可以用逻辑词 and 来构建多条件查询语句。更多操作请看org.Bson.Document类。

         FindIterable<Document> iterable = 
    
              db.getCollection("restaurants").find( 
                new Document(
                      "cuisine", "Italian").append("address.zipcode", "10075"));
    

    迭代出结果集:

       iterable.forEach(new Block<Document>() { 
    
                    @Override 
                    public void apply(final Document document) { 
                        System.out.println(document);
         }});
    

    或者可以用Filter类提供的静态方法:

         db.getCollection("restaurants").find(and(
    
                eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
    

    逻辑连接词or
    你可以用逻辑连接词or来构建查询:

         FindIterable<Document> iterable = 
    
                db.getCollection("restaurants").find( 
                    new Document("$or", asList(new Document(
                      "cuisine", "Italian"), 
                    new Document("address.zipcode", "10075"))));
    

    然后迭代出结果集:

       iterable.forEach(new Block<Document>() { 
    
                @Override 
                public void apply(final Document document) { 
                      System.out.println(document); 
         }});
    

    或者可以用Filter类提供的静态方法:

       db.getCollection("restaurants").find(
    
              or(eq("cuisine", "Italian"), eq("address.zipcode", "10075")));
    

    给结果集排序

    给结果集排序,我们用 sort() 方法,通过该方法,我们传入参数1表示升序排列,-1表示降序排列。
    例如,以下操作返回restaurant集合里的所有文档,按照borough升序排列,每一个borough里面,按照"address.zipcode"升序排列。

         FindIterable<Document> iterable = 
    
                db.getCollection("restaurants").find() .sort(
                  new Document("borough", 1).append("address.zipcode", 1));
    

    然后迭代出结果集:

         iterable.forEach(new Block<Document>() { 
    
                @Override 
                public void apply(final Document document) { 
                    System.out.println(document); 
          }});
    

    使用静态排序 Sort方法,还可以这么做:

      db.getCollection("restaurants").find().sort(
    
                  ascending("borough", "address.zipcode"));
    

    其他

    更多内容,请看Java驱动包文档。Filter


                    ---by  冰天百华

    相关文章

      网友评论

          本文标题:【原创】【译】MongoDB 3.0.6查询数据

          本文链接:https://www.haomeiwen.com/subject/zjvbcttx.html