【原創(chuàng)】【譯】MongoDB 3.0.6查詢數(shù)據(jù)

概述

在MongoDB中,你可以用查詢 find 方法來從一個(gè)集合中查詢數(shù)據(jù)。MongoDB的所有查詢都是單個(gè)集合范圍內(nèi)。

查詢能返回集合中的所有文檔,或者是最符合條件的文檔。你可以用
org.bson.Document里的find方法,傳入?yún)?shù)查詢。

該 find方法用FindIterable(生成文檔的迭代對象)來返回一個(gè)查詢結(jié)果。

預(yù)備條件

該例子仍然使用test數(shù)據(jù)庫中的restaurant集合。關(guān)于導(dǎo)入數(shù)據(jù)集的相關(guān)操作,請看之前的博文。


緊跟著之前的操作,從連接數(shù)據(jù)庫,到運(yùn)行MongoDB,到創(chuàng)建test數(shù)據(jù)庫和restaurant集合。
我們需要導(dǎo)入以下的包:

     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;

在一個(gè)集合中查詢所有的文檔

為了查詢出所有的文檔,我們在find方法中不需要傳入任何條件。例如,以下的操作就能返回restaurant集合中的所有文檔:

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

迭代結(jié)果集,并用塊(block)運(yùn)用到每個(gè)文檔:

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

該結(jié)果集包含了restaurant里的所有文檔。


指定平等條件

用MongoDB提供的Java驅(qū)動包來實(shí)現(xiàn)平等條件查詢,例如:

       new Document( <field>, <value> )

如果<field>是一個(gè)內(nèi)嵌的文檔或者數(shù)組,用.點(diǎn)符號來訪問。
為了定制查詢條件,MongoDB的Java驅(qū)動包提供了 Filter類。該類包含各種靜態(tài)方法來簡化查詢操作,例如下面的 eq方法:

     eq(<field>, <value>)

通過頂級域查詢

以下操作查詢 borough為 “Manhattan”的文檔。

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

迭代結(jié)果集,并用塊(block)運(yùn)用到每個(gè)文檔:

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

利用 Filter類提供的靜態(tài)方法,你還可以這么做:

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

用嵌入式文檔查詢字段

為了在帶有嵌入式文檔的域中明確查詢條件,我們使用點(diǎn)記法。點(diǎn)記法需要傳入整個(gè)全限定名,以下操作指定查詢在address域里的zipcode嵌入文檔。

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

迭代結(jié)果集:

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

或者用Filter類的靜態(tài)方法,還可以這么做:

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

更多關(guān)于帶有嵌入文檔的查詢,請看Embedded Documents


數(shù)組中的域查詢

grade數(shù)組包括很多嵌入的文檔。要明確查詢條件,我們用點(diǎn)記法。
點(diǎn)記法仍然需要我們傳入整個(gè)全限定名,以下操作是獲得grade為B的結(jié)果集。

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

迭代結(jié)果:

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

或者可以用Filter類提供的靜態(tài)方法,

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

更多關(guān)于數(shù)組的查詢,請看Arrays


明確條件的操作

MongoDB提供明確條件的查詢,例如比較操作Comparison Query Operators,盡管還有一些比如or和and操作,這些操作的大致都有以下格式:

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

為了明確查詢條件,MongoDB的Java驅(qū)動包提供了Filter類提供很多靜態(tài)方法建立查詢,其中包括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)));

然后迭代結(jié)果集:

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

或者可以用Filter類提供的靜態(tài)方法:

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

lt的操作

我們查詢出grade里score小于10的結(jié)果集:

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

迭代出結(jié)果集:

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

或者可以用Filter類提供的靜態(tài)方法:

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

聯(lián)合查詢

你可以用邏輯連接詞 and或者 or來構(gòu)建聯(lián)合查詢。
邏輯詞 and
你可以用邏輯詞 and 來構(gòu)建多條件查詢語句。更多操作請看org.Bson.Document類。

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

迭代出結(jié)果集:

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

或者可以用Filter類提供的靜態(tài)方法:

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

邏輯連接詞or
你可以用邏輯連接詞or來構(gòu)建查詢:

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

然后迭代出結(jié)果集:

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

或者可以用Filter類提供的靜態(tài)方法:

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

給結(jié)果集排序

給結(jié)果集排序,我們用 sort() 方法,通過該方法,我們傳入?yún)?shù)1表示升序排列,-1表示降序排列。
例如,以下操作返回restaurant集合里的所有文檔,按照borough升序排列,每一個(gè)borough里面,按照"address.zipcode"升序排列。

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

然后迭代出結(jié)果集:

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

使用靜態(tài)排序 Sort方法,還可以這么做:

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

其他

更多內(nèi)容,請看Java驅(qū)動包文檔。Filter


                ---by  冰天百華
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容