MongoDB的查询命令

2018-01-11 12:47:12来源:网络收集作者:纳米程序员人点击

分享

阿里云爆款
find查询
> db.mycollection.find({"name":"foo"})

多个条件时,逗号分割开查询条件即可:


> db.mycollection.find({"name":"foo", "age":20})
指定需要返回的键

可以通过第二个参数来获取指定的键,这样节省传输的数据量,同时也节省客户端解码文档的时间和内存消耗。


> db.mycollection.find({},{"name":1, "age":1})
{
"_id" : ObjectId("5a52dd8e87df659d59e547de"),
"name" : "foo",
"age" : 20.0
}

这样,返回的文档就只有 _id、name、age 三个键,主键 _id 是默认返回的。可以不取某些字段:


> db.mycollection.find({},{"name":1,"_id":0})
{
"name" : "foo"
}

返回值中只有 name,_id 都没有返回。


查询条件
$lt $lte $gt $gte

这4个比较操作符
比如查询年龄大于等于18,小于等于30的文档


> db.mycollection.find({"age":{$gte:18,$lte:30}})
$ne

表示不相等


> db.mycollection.find({"name":{$ne:"foo"}})

返回的结果不包括name为foo的文档,已被剔除。


$in

$in可以将一个键与多个值进行匹配,满足条件的都将返回


> db.mycollection.find({"name":{$in:["foo1", "foo3"]}})

数组只有一个值时,和直接匹配的效果是一样的。
相反的,$nin 能返回和给出数组都不匹配的文档。


$or

对不同的键的多条件的 or 查询,比如要查 name 为 foo,或者 age 为18的文档,两个条件符合任何一个均返回


> db.mycollection.find({$or:[{"name":"foo"},{"age":18}]})
{
"_id" : ObjectId("5a52dd8e87df659d59e547de"),
"name" : "foo",
"age" : 20.0
}
{
"_id" : ObjectId("5a52de4f87df659d59e547e2"),
"name" : "foo1",
"age" : 18.0
}

使用普通的 and 型查询时,总希望用尽可能少的条件来限定结果的范围,但 or 查询相反,第一个条件应该尽可能匹配到更多的文档,这样才是最高效的。
$or 在任何情况下都能正常工作,而如果查询优化器可以更高效的处理 $in 的话,就使用 $in。


$not
$and

查询器不会对 and 进行优化,有时优化后效率会更高。


$exists

查出 age 字段存在的文档:


> db.mycollection.find({"age":{$exists: true}})
正则表达式
> db.mycollection.find({"name":/foo/i})

这个表达式可以查出 name 键中不区分大小写的和值 foo 匹配的所有文档。MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式,所有PCRE支持的正则表达式语法都能接受。


查询数组
$all
> db.mycollection.find({"content":{$all:["hello1","hello3"]}})
{
"_id" : ObjectId("5a52dd8e87df659d59e547de"),
"name" : "foo",
"age" : 20.0,
"content" : [
"hello1",
"hello3"
],
}

$all 后跟数组参数,可以查出某个字段值包含所有所列出字段的文档。
查询数组特定位置的元素,应该使用 “.” 操作符,例如:


> db.mycollection.find({"content.1":"hello3"})

注意数组下标是从 0 开始的。


$size

$size 可以用来查询特定长度的数组。


> db.mycollection.find({"content":{$size : 2}})

但是 $size 不能和其他操作符,如比较操作符等同时使用。


$slice

find的第二个参数,$slice 可以返回和某个键匹配的数组元素的一个子集。


> db.mycollection.find(criteria, {"comments":{$slice : 10}})

可以返回文档评论中的前10条,如果为 -10,则返回最后 10 条。


> db.mycollection.find(criteria, {"comments":{$slice : [20,10]}})

此查询将返回数组中第20个元素开始的10个元素。如果不足,则返回从20开始到最后的元素。
使用 $slice 时将返回文档中的所有键。
如果在当前查询的字段上创建过索引,可以使用 min() 和 max() 函数来将查询条件遍历的索引范围限制在某个范围值之间。


> db.mycollection.find({"x":{$gte:10, $lte:20}}).min({"x":10}).max({"x":20})

现在这个查询只会遍历位于10和20之间的索引,不再与5和25进行比较。只有建立过索引的查询字段上才可以使用min和max,而且必须为这个索引的所有字段指定min和max。
在可能包含数组的文档上应用范围查询时,使用min和max是非常好的。如果在整个索引范围内使用 大于小于 查询,效率是非常低的。查询条件会与所有值进行比较,会查询每一个索引,而不仅仅是指定索引范围内的值。


返回一个匹配的数组元素
> db.mycollection.find({"top5.name":"tt2"},{"top5.$":1})

返回与查询条件匹配的任意一个元素。可以用 $ 操作符得到一个匹配的元素。如果有多条匹配,则返回第一条


数组和范围查询的相互作用
{"x":{$gt:10, $lt:20}}

这样的范围查询,对数组来说,会将 [5 , 25] 这样的数组也查出来,因为 5 小于 20, 25 大于 10,条件都满足。这样对数组来说范围查询是无效的,会匹配任意多的数组元素。


查询内嵌文档

比如有这样的文档,需要查询 top5 中 name 值为 tt2 的文档:


{
"_id" : ObjectId("5a52dd8e87df659d59e547de"),
"name" : "foo",
"age" : 20.0,
"content" : [
"hello1",
"hello3"
],
"top5" : [
{
"name" : "tt2",
"rating" : "96"
},
{
"name" : "t3",
"rating" : "93"
},
{
"name" : "t4",
"rating" : "92"
},
{
"name" : "t5",
"rating" : "91"
},
{
"name" : "t6",
"rating" : "90"
}
]
}
> db.mycollection.find({"top5.name":"tt2"})

可以使用 点 “.”操作符,来表达进入内嵌文档的意思。


> db.mycollection.find({"top5":{$elemMatch: {"name":"tt2", "rating":"96"}}})

$elemMatch 操作符,可以用来在查询条件中部分指定匹配数组中的单个内嵌文档。将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才用到。


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台