【原创】【译】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<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  冰天百华
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容