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

概述

在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 iterable = db.getCollection("restaurants").find();

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

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

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


指定平等条件

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

       new Document( ,  )

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

     eq(, )

通过顶级域查询

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

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

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

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

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

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

用嵌入式文档查询字段

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

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

迭代结果集:

       iterable.forEach(new Block() {
               @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 iterable = 
          db.getCollection("restaurants").find(
             new Document("grades.grade", "B"));

迭代结果:

       iterable.forEach(new Block() { 
              @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( , new Document( ,  ) )

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

   lt(, )
   gt(, )

gt的操作:

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

然后迭代结果集:

   iterable.forEach(new Block() { 
            @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 iterable = 
            db.getCollection("restaurants").find( 
              new Document("grades.score", new Document("$lt", 10)));

迭代出结果集:

     iterable.forEach(new Block() { 
              @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 iterable = 
          db.getCollection("restaurants").find( 
            new Document(
                  "cuisine", "Italian").append("address.zipcode", "10075"));

迭代出结果集:

   iterable.forEach(new Block() { 
                @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 iterable = 
            db.getCollection("restaurants").find( 
                new Document("$or", asList(new Document(
                  "cuisine", "Italian"), 
                new Document("address.zipcode", "10075"))));

然后迭代出结果集:

   iterable.forEach(new Block() { 
            @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 iterable = 
            db.getCollection("restaurants").find() .sort(
              new Document("borough", 1).append("address.zipcode", 1));

然后迭代出结果集:

     iterable.forEach(new Block() { 
            @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查询数据)