MongoDB的查询

Posted on 2013-01-28 22:44  chace0120  阅读(4525)  评论(11编辑  收藏  举报

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。

Copyright © 2024 chace0120
Powered by .NET 9.0 on Kubernetes