开发者学堂课程【MongoDB精讲课程(上):文档的更多查询】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/726/detail/12960
文档的更多查询
内容介绍
一、正则的复杂条件查询
二、比较查询
三、包含查询
四、条件连接查询
一、正侧的复杂条件查询
首先来说正则,正则是一个比较强大的东西, MongoDB 支持 js 正则表达式的写法。
也就是通过正则表达式去实现模糊的查询,一个匹配的查询,正则怎么查询怎么匹配, MongoDB 都可以实现,因为它是完全支持 js 的写法的。
它怎么匹配在目的地查数据的时候都可以实现,因为它是完全支持这个 jS 的正则写法的,那它的写法是这样的,首先不管怎么写,肯定语法格式就是 db ,你的集合 comment 先翻译了一下,然后这里面再根据你的查询条件,比如说咱们查询这个包含开水,通过这个正则的写法,冒号这里就不能写字符串了,写字符串就是等于开水,是查不出来任何东西的,那我们要用这样的写法,
db.comment.find({content:/开水/})这样写的话就代表找的是只要包含这个开水的文档,都可以查出来。
MongoDB 的模糊查询是通过正则表达式的方式实现的。格式为:
db.collection.find({field:/正则表达式/}) 或
db.集合.find({字段:/正则表达式/})
提示:正则表达式是 js 的语法,直接量的写法。
例如,查询评论内容包含“开水”的所有文档,代码如下:
db.comment.find({content:/
开水/})
如果要查询评论的内容中以“专家”开头的,代码如下:
db.comment.find({content:/^
专家/})
无论正则多复杂 MongoDB 都可以查询
二、比较查询
比较查询比较简单,一般就是大于、小于、大于等于、小于等于、不等于这些。
那它的写法就是通过条件语句,首先你的字段名、冒号,冒号之后,再要跟上一个括号,括号之后写指令。比如说这个点赞数量大于700,那大于就用这个 gt 这个指令。
首先同样的 comment. find 这个语法,然后我们要找点赞数,就是 likenum ,这里就不直接写了,我们要用一个花括号包起来,然后要写指令,大于就是$ gt ,大于700我们不能直接写700,要用这个函数 NumberInt 包一下,这里面写上700,这时候查询的就是点赞数大于700的文档,其他的大于、小于、大于等于、小于等于、不等于都是同样的写法。
<,<=,>,>=这个操作符也是很常用的,格式如下:
db.集合名称.find({“field”:{$gt:value}})//大于:field>value
db.集合名称.find({“field”:{$lt:value}})//小于:field<value
db.集合名称.find({“field”:{$gte:value}})//大于等于:field>=value
db.集合名称.find({“field”:{$lte:value}})//小于等于:field<=value
db.集合名称.find({“field”:{$ne:value}})//不等于:field!=value
示例:查询评论点赞数量大于700的记录
db.comment.find({likenum:{$gt:NumberInt(700)}})
三、包含查询
包含使用 $in 操作符。
类比到其他的,包含查询的 in 就是 in 语法。一般情况下,我们写一条语句,你的字段 id in{1,2,3} id 有1,2,3的都可以查出来,这就是 in 语法。 MangoDB 也支持in 的写法。它的写法一样,通过字段,然后匹配指令,指令就是到了 in ,既然是 in ,后面肯定是跟的是一个数组。db.comment.find({userid:{$in:[“1003”]}})这时候1003的两条记录就可以查出来了。一般情况下我们不会直接用单条,数组可以跟多个数字。
示例:查询评论的集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$in:[
“1003”,”1004”]}})
不包含使用 $nin 操作符。
示例:查询评论集合中userid字段不包含1003和1004的文档
db.comment.find({userid:{$nin:[
“1003”,”1004”]}})
四、条件连接查询
条件查询就是 and 和 or 。并且和或的一个关系,这种写法稍微有些特殊,他就不是先写字段了,而是先把指令集写出来。
当然前面的 fiind 的查询还是一样的,那 find 之后先用花括号把指令集写出来。指令集写出来之后,后面跟的是一个数组,就是说要编写的这些条件。比如说我们现在要查询这个 likenum 大于等于700并且小于2000的文档,那我们至少是得有两个条件,那这个两个条件呢,都是写在and的这个数组里面的。
我们如果需要查询同时,满足两个以上条件,需要使用 $and 操作符将条件进行关联。(相当于 SQL 的 and )
格式为:
$and:[ { },{ },{ } ]
示例:查询评论集合中 likenum 大于700并且小于2000的文档:
db.comment.find({$and:[{likeunm:NumberInt(700)}},{likenum:{$lt:NumberTnt(2000)}}]})
如果两个以上条件之间是或者的关系,我们使用操作符进行关联,与前面 and 的使用方式相同
格式为:
$or:[ { },{ },{ } ]
or的写法和and 完全一样,实际上就是把 and 改成 or 就可以了。里面的条件可以随意发挥。
比如说我们根据这个需求,我们查询的是这个 userid 是1003并且点赞数小于1000,那我们就可以写了,我们先删除到最简的格式 db.comment.find({$。
然后冒号这里是数组,数组里面跟上两个条件这就是一个完整的格式,那这里面我们分别去写条件。
第一个user ID是1003,然后第二个条件是点赞数 likenum 小于1000,小于就是$lt ,我们要写规范一点, {likenum:{$lt:1000}}]}) 那这时候查询出来的就是 userid 1003点赞数小于1000。
示例:
查询评论集合中的 userid 为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[ {userid:
”1003”},{likenum:{$lt:1000}}]})
五、常用命令小结
那么下面把之前学的这些常用的命令做个小结,首先我们基本的切换数据库,或者说创建数据库用的都是 use ,那 use 的时候,如果没有库我们就去创建,有库它实际上是切换。
插入数据库,用的就是 insert 语句,Insert 里面放的是 bdon 数据,bson 数据实际上类比的格式就是 json 的格式。所有的查询都是 db 然后集合名,然后 find 可以跟上你的条件,这个条件,可以是很复杂的也可以是很简单的,通过字段去直接匹配就可以了,那如果查询第一条记录,就是用 findOne ,如果是查询前几条条件用 limit 限制返回的行数,既然有 limit 我们要做分页,还有跳过 skip 。update 比较简单的用法就是第一个参数跟上条件,要更新哪些,那第二个更新的就是你修改后的数据,这就是 update 。
当然,如果这么写的话,是覆盖更新,如果只修改更新的话,需要加上一个$set 指令。自增列的写法也是比较简单,就把 update 条件 $inc 这个指令,然后跟上自身的字段,然后就是你要加一就写一。那 remove 比较简单,直接就也没有什么更新条件了,直接 remove 根据条件就可以,不需要修改后的数据,不像 update 需要麻烦一点,还需要一个修改后的数据。 remove 直接根据条件 remove 就行。
count 也是类似的,根据条件 count 或者直接 count 查询的是所有的。 count 出来就是统计所有当前的集合、所有的文档的数。模糊查询用正则。比较查询就是通过 $gt 指令集的一个写法。包含查询主要是 $in ,然后不包含就是 not in 也就是 $nin 。连接查询,咱们刚刚学的 and 和 or 它的写法稍微有点特殊,就不是先写字段名了。
前面这几个查询,所有的查询条件都是先写字段名然后里面再去写复杂指令之类的,那么 and 和 or ,就是且和或都是先写指令集,然后指令集里面再去写数组,数组里面再包含条件,就是稍微复杂一点,理解性的记忆也是非常简单的,因为 and 肯定是不知道不确定是哪一个条件,所以我们先把指令集写出来,然后里面用数组,再去包含多个条件,or 也是同理。
选择切换数据库:use articledb 插入数据:db.comment.insert({bson 数据})
查询所有数据:db.comment.find():
条件查询数据:db.comment.find({条件})条件可以是很复杂的,也可以是很简单的,通过字段直接匹配就可以了。
查询符合条件的第一条记录:db.comment.findOne({条件})
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件}),{修改后的数据}) update 比较简单的用法是,第一个参数跟上条件,要更新哪些条件,第二个要更新的就是修改后的数据。或 db.comment..update({条件}),{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件}),{$inc:{自增的字段:步进值}})
删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})