好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

MongoDB的查询

MongoDB的查询

1.多查询条件

向查询文档加入多个键/值对的方式可以实现多个查询条件的组合。例如要查询所有用户名为“joe”且年龄为27岁的用户,可以像下面这样:

 1  >db.users.find({“username” : “joe”, “age” : 27})

2.指定返回结果的键

例如,如果只需要用户集合的“username”和“email”键感兴趣,可使用如下查询:

 1  >db.users.find({}, {“username” : 1, “email” : 1})

同时也可以剔除查询结果中的某个键/值对,例如如果不希望结果中有“fatal_weakness”键,命令如下:

 1  >db.users.find({}, {“fatal_weakness” : 0})

也可以用来防止返回“_id”。

3.查询条件

“$lt”小于,”$lte”小于等于,“$gt”大于,“$gte”大于等于,“$ne”不等于,例如:

 1  >db.users.find({“age” : {“$gte” : 18, “$lte” : 30}})

$in类似Mysql中的IN,用法如下:

 1  >db.raffle.find({“ticket_no” : {“$ in ” : [725, 542, 390]}})

$or类似Mysql中的OR,用法如下:

 1  >db.raffle.find({“$or” : [{“ticket_no” : 725}, {“winner” :  true }]})

$not类似Mysql中的逻辑操作符NOT,用法如:

 1  >db.user.find({“id_num” : {“$not” : {“$mod” : [5, 1]}}})

说明:“$mod”会将查询的值除以第一个给定值,若余数等于第二个给定值则返回该结果。

注意:一个键可以应用多个条件句,但不能对应多个更新修改器。

4.特定类型的查询

null:

null不仅仅匹配自身,而且匹配缺少这个键的所有文档。若仅仅想要匹配键值为null的文档,用法如下:

 1  >db.c.find({“z” : {“$ in ” : [ null ], “$exists” :  true }})

正则表达式:

MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,PCRE支持的正则表达式语法都能被MongoDB所接受。例如可以使用正则表达式执行忽略大小写的匹配,如下:

 1  >db.users.find({“name” : /joe/i})

数组:

若要查询数组中的元素,可以理解为每个元素都是整个键的值。例如:

>db.food.insert({“fruit” : [“apple”, “banana”, “peach”]})

那么查询“fruit”键的值中包含“banana”的文档如下:

 1  >db.food.find({“fruit” : “banana”})

但要是想通过多个元素来匹配数组时,要使用“$all”,例如:

 1  >db.food.find({“fruit” : {“$all” : [“apple”, “banana”]}})

内嵌文档:

查询内嵌文档的方法:查询整个文档,或者只针对其键/值对进行查询。例如有如下文档:

  1   {
   2  
  3            “name” : {
   4  
  5            “first” : “Joe”,
   6  
  7            “last” : “Schmoe”
   8  
  9   }
  10  
 11  “age” : 45
 12  
 13  }

查询整个内嵌文档如下:

 1  >db.people.find({“name” : {“first” : “Joe”, “last” : “Schmoe”}})

但需要注意这里的“name”键的值必须匹配整个文档。

只针对内嵌文档的特定键值进行查询如下:

 1  >db.people.find({“name.first” : “Joe”, “name.last” : “Schmoe”})

查询数组中嵌套内嵌文档:

若文档结构如下:

  1   {
   2  
  3            “content” : “joe”,
   4  
  5            “comments” : [
   6  
  7            {
   8  
  9                      “author” : “joe”,
  10  
 11                     “score” : 3 ,
  12  
 13                      “comment” : “nice post”
  14  
 15   },
  16  
 17   {
  18  
 19            “author” : “mary”,
  20  
 21           “score” : 6 ,
  22  
 23            “comment” : “terrible post”
  24  
 25   }
  26  
 27   ]
  28  
 29  }

那么要查询由Joe发表的5分以上的评论,写法如下:

 1  >db.blog.find({“comments” : {“$elemMatch” : {“author” : “joe”, “score” : {“$gte” : 5}}}})

5.游标

获取游标的方法如下:

 1  > var  cursor = db.foo.find().sort({“x” : 1}).limit(1).skip(10 );
  2  
 3  > while  (cursor.hasNext()) {
  4  
 5  …obj =  cursor.next();
  6  
 7  … //  do stuff 
 8  
 9  …}

这里游标类还实现了迭代器接口,可以在foreach循环中使用。

 1  >cursor.forEach( function  (x)) {
  2  
 3   …print(x.name);
  4  
 5  });

注意:几乎所有游标对象的方法都返回游标本身,这样就可以按任意顺序组成方法链。

上述内容中的limit(n)表示限制结果的数量,只返回n个结果。而skip(n)表示略过前n个文档,然后返回余下的文档。sort()用一个对象作为参数:一组键/值对,值代表排序方向,排序方向可以是1(升序)或者-1(降序),如果指定了多个键,则按照多个键的顺序逐个排序。

注意:用skip略过少量的文档还是不错的,但要是数量非常多的话,skip会变得很慢,应避免过大的skip。

 

 

 

标签:  mongoDB ,  noSql ,  数据库

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于MongoDB的查询的详细内容...

  阅读:39次