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。