MongoDB的查询命令

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值