空的查询文档将匹配集合的全部内容:
db.test.find({})
可以向查询文档中添加多个键值对,将多个查询条件组合在一起:
查找年龄在[20, 30]范围内的用户:
" $in"非常灵活,可以指定不同类型的键和值
假设有id范围为[1,12]的用户,返回不等于能被5整除余1的用户id:
返回仅仅匹配键值为null的文档:
$all: 通过多个元素来匹配数组
找到既有apple又有banana的文档:
例如下面查询就不能找到上面新插入的文档
db.food.find({"fruit": ["apple", "banana"]})
查询数组特定位置的元素,可以使用 key.index语法指定下标
db.food.find({"fruit.2": "peach"})
db.test.find({})
可以向查询文档中添加多个键值对,将多个查询条件组合在一起:
db.users.find(
{"age": 20, "gender": "male"}
)
指定需要返回的键
可以通过find(或者findOne)的第二个参数来指定想要返回的键: db.test.find(
{},
{"url": 1, "pageviews": 1, "_id": 0} // 默认情况下"_id"键总是被返回
)
查询条件
" $lt", " $lte", " $gt", " $gte"就是全部的比较操作符,分别对应<, <=, >, >=。可以将其组合起来以便查找一个范围的值。查找年龄在[20, 30]范围内的用户:
db.users.find(
{"age": {"$gte": 20, "lte": 30}}
)
对于文档的键值不等于某个特定值的情况,需要使用条件操作符"
$ne",它表示!=
OR查询
MongoDB有两种方式进行OR查询:"$in"可以用来查询一个键的多个值,"$or"可以在多个键中查询任意的给定值" $in"非常灵活,可以指定不同类型的键和值
db.users.find(
{"user_id": {"$in": [12345, "joe"]}}
)
要是"$in"对应的数组只有一个值,那和直接匹配这个值效果一样
db.users.find(
{"user_id": {"$in": ["joe"]}} // == {"user_id": "joe"}
)
"
$or"接受一个包含所有可能条件的数组作为参数,OR型查询第一个条件应该尽可能多的匹配更多的文档,这样才最高效
db.raffle.find(
{"$or": [
{"ticket_no": {"$in": [451, 623, 985]}},
{"winner": true}
]}
)
$not
" $not"操作是元条件句,即可以用在任何其他条件之上。拿取模运算"$mod"来说," $mod"会将查询的值除以第一个给定值,若余数等于第二个给定值则匹配成功假设有id范围为[1,12]的用户,返回不等于能被5整除余1的用户id:
db.users.find(
{"id_number": {"$not": {"$mod": [5, 1]}}}
)
条件语义
基本情况下,条件语句是内层文档的键,而修改器则是外层文档的键。有一些元操也位于外层文档中,比如"$and", "$or", "nor"。一个键可以有任何多个条件,但是一个键不能对应多个更新修改器。
特定类型的查询
null
null不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档返回仅仅匹配键值为null的文档:
db.test.find(
{"url": {"$in": [null], "$exists": true}}
)
正则表达式
正则表达式能灵活有效地匹配字符串。系统可以接受正则表达式标志(i),但并不是一定要有。正则表达式也可以匹配到自身,虽然几乎没有人直接将正则表达式插入到数据库中。 db.test.insert({"bar": /foo/})
db.test.find({"bar": /foo/})
MongoDB可以为前缀型正则表达式(比如: /^zhang/)查询创建索引,所以这种类型的查询会非常高效
查询数组
db.food.insert({"fruit": ["apple", "banana", "peach"]}) 查询:db.food.find({"fruit": "banana"})会成功匹配到该文档$all: 通过多个元素来匹配数组
找到既有apple又有banana的文档:
db.food.find(
{"fruit": {"$all": ["apple", "banana"]}}
)
也可以使用整个数组进行精确匹配,但是,精确匹配对于缺少元素或者元素冗余的情况失灵
例如下面查询就不能找到上面新插入的文档
db.food.find({"fruit": ["apple", "banana"]})
查询数组特定位置的元素,可以使用 key.index语法指定下标
db.food.find({"fruit.2": "peach"})
$slice:前面提及,find的第二个参数是可选的,可以指定需要返回的键。而$slice操作符可以返回某个键匹配的数组元素的一个子集,使用$slice将返回文档中的所有键,即便你并没有显示地出现在键的说明符中
返回某篇博客评论的前10条:
返回某篇博客评论的24~33个元素:
返回所有博客下zhangsan的第一条评论:
先看一个示例(假设有如下所示的文档):
{"x": 5}
{"x": 15}
{"x": 25}
{"x": [5, 25]}
如果希望找到"x"键的值位于10和20之间的所有文档,直接想到的查询方式:db.test.find({"x": {"gt": 10, "$lt":20}}),希望返回的文档是{"x": 15},但是实际上它返回了两个文档:{"x": 15}和{"x": [5, 25]}, why?因为25与查询条件中的第一条语句(大于10)相匹配,5与查询条件中的第二个语句(小于20)相匹配。
解决这种问题的方法:
预期返回:{"x": 15}
使用方法:db.test.find({"x": {"$gt": 10, "$lt": 20}}).min({"x": 10}).max({"x": 20})
使用条件:需在当前查询字段创建过索引,但是在索引范围内对数组使用"gt"/"lt"查询,效率非常低。
预期返回:{"x": [5, 25]}
使用方法:db.test.find({"x": {"$elemMatch": {"$gt": 10, "$lt": 20}}})
温馨贴士:"elemMatch"要求MongoDB同时使用查询条件中的两个语句与一个数组元素进行比较,而且,"elemMatch"不会匹配非数组元素
返回某篇博客评论的前10条:
db.blog.findOne(
criteria,
{"comments": {"$slice": 10}}
)
$slice也可以指定偏移值以及希望返回的元素数量,来返回元素集合中间位置的某些结果
返回某篇博客评论的24~33个元素:
db.blog.findOne(
criteria,
{"comments": {"$slice": [23, 10]}} //[偏移量(从24开始), 总个数]
)
返回一个匹配的数组元素
返回所有博客下zhangsan的第一条评论:
db.blog.find(
{"comments.name": "zhangsan"},
{"comments.$": 1}
)
数组和范围查询的相互作用
先看一个示例(假设有如下所示的文档):
{"x": 5}
{"x": 15}
{"x": 25}
{"x": [5, 25]}
如果希望找到"x"键的值位于10和20之间的所有文档,直接想到的查询方式:db.test.find({"x": {"gt": 10, "$lt":20}}),希望返回的文档是{"x": 15},但是实际上它返回了两个文档:{"x": 15}和{"x": [5, 25]}, why?因为25与查询条件中的第一条语句(大于10)相匹配,5与查询条件中的第二个语句(小于20)相匹配。
解决这种问题的方法:
预期返回:{"x": 15}
使用方法:db.test.find({"x": {"$gt": 10, "$lt": 20}}).min({"x": 10}).max({"x": 20})
使用条件:需在当前查询字段创建过索引,但是在索引范围内对数组使用"gt"/"lt"查询,效率非常低。
预期返回:{"x": [5, 25]}
使用方法:db.test.find({"x": {"$elemMatch": {"$gt": 10, "$lt": 20}}})
温馨贴士:"elemMatch"要求MongoDB同时使用查询条件中的两个语句与一个数组元素进行比较,而且,"elemMatch"不会匹配非数组元素
查询内嵌文档
查询整个文档(精确匹配,如果文档中name键下新增字段,则匹配失败,而且这种查询还是与顺序相关的)
查询joe发表5分好评的博客:
查询整个文档(精确匹配,如果文档中name键下新增字段,则匹配失败,而且这种查询还是与顺序相关的)
db.users.find(
{"name": {"first": "joe", "last": "schmoe"}}
)
只针对键/值对进行查询(对于文档中包含"."的键[例如:URL],点表示法会有局限性,一种解决办法是在插入前或者提取后执行一个全局替换,将"."替换成一个URL中非法字符)
db.users.find(
{"name.first": "joe", "name.last": "schmoe"}
)
$elemMatch:在查询条件中部分指定匹配数组中的单个内嵌文档。$elemMatch将限定条件进行分组,仅当需要对一个内嵌文档的多个键进行操作时才会用到
查询joe发表5分好评的博客:
db.blog.find(
{"comments": {"$elemMatch": {
"author": "joe",
"score": {"$gte": 5}
}}}
)