Mongodb的基本操作
1. 选择和创建数据库
- 数据库的创建和进入数据库都是一个命令
use 库名 |
- 创建一个数据库名为articledb
use articledb |
注意mongodb的存储方式,只创建库没有数据时候,这个时候数据库是存在内存中,只有数据库中有内容才会存放到磁盘,所以创建完没有数据的库使用show dbs是看不到库的。
- 查看权限内所有的数据库
show dbs |
- 查看当前正在使用的数据库
db |
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
2. 数据库的删除
db.dropDatabase() |
3. 集合操作
3.1 集合的显式创建
基本语法格式
db.createCollection(集合名称) |
- 创建一个名为mycollection的普通集合
db.createCollection(mycollection) |
- 查看当前库中的集合(表)
show collections |
3.2 集合的隐形创建
当向一个集合插入一个文档的时候,如果集合不存在,则自动创建集合
具体看文档插入部分
通常我们使用隐式创建文档
3.3 删除集合
基本语法格式
db.集合名.drop() |
- 删除mycollection集合
db.mycollection.drop() |
4. 文档的基本操作(增删改查)
4.1 文档的插入
- 单个文档插入
创建一个comment的集合,并插入文档
db.comment.insert({"articleid":"10000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null}) |
提示:
1)comment集合如果不存在,则会自动创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了
3)插入当前日期使用new Date()
4)插入的数据没有指定_id,会自动生成主键值
5)如果某个字段没值,可以赋值为null,或者不写该字段
- 批量插入
批量插入多条文章评论:
> db.comment.insertMany([{"articleid":"10001","content":"Are you ok","userid":"1002","nickname":"alonzo","createdatetime":new Date(),"likenum":NumberInt(1000),"state":"1"}, |
学过Python应该就看出来,这里实际就是将多个字典插入列表里,形成一个表的多条数据
4.2 文档的查询
语法
db.文档名.find() |
> db.comment.find() |
- 条件查询,比如查询articleid为10001的记录
> db.comment.find({articleid:"10001"}) |
- 如上条件,但只想返回第一条数据
> db.comment.findOne({articleid:"10001"}) |
- 投影查询
查询nickname为alonzo,只显示userid且不显示_id:
> db.comment.find({nickname:"alonzo"},{userid:1,_id:0}) |
查询结果只显示userid、nickname不显示_id:
> db.comment.find({},{userid:1,nickname:1,_id:0}) |
实际上投影查询就是查询表中的列可以理解为db.comment.find({行筛选},{列筛选})
行筛选需要指定具体数据,列筛选指定0和1,0为不显示,1为显示
- 由于批量插入数据较多容易出现失败,因此,可以使用try,catch进行异常处理,测试的时候可以不处理
try { |
目前没怎么理解这个功能
4.3 文档的更新
更新文档的语法:
db.collection.update(query,update,options) |
- 覆盖的修改
修改userid为1002的记录,点赞量为1001,输入以下语句:
> db.comment.update({userid:"1002"},{likenum:NumberInt(1001)}) |
可以看到这条更新修改把整个数据都给覆盖了,重新生成了之前修改的部分
- 局部修改
为了解决这个问题,需要使用$set来实现,之前添加文档的时候细心的朋友可能发现有个userid的值是mifans,这个是错误的,现在想把它改为1004,然后nickname改为mifans,命令如下:
> db.comment.update({userid:"mifans"},{$set:{userid:"1004",nickname:"mifans"}}) |
- 批量的修改
更新所有用户为1003的用户昵称为lisi
#默认只修改第一条数据 |
所以只要后面不加参数{multi:true}则只更新第一条数据
- 列值增长的修改
如果我们想实现对某列值在原有值的基础上的进行增加或减少,可以使用$inc运算符来实现。
下面是对userid为1003的点赞数进行递增操作,每次递增2
> db.comment.find({userid:"1003"}) |
4.4 删除文档
删除文档的语法结构:
db.集合名称.remove(条件) |
以下语句可以讲数据全部删除,请慎用
db.comment.remove({}) |
- 如果删除userid为1003的记录,输入以下语句
> db.comment.find() |
- 删除comment里的全部数据
> db.comment.remove({}) |
5. 文档的分页查询
首先先将上面删除的数据给创建出来
#创建初始数据 |
5.1 统计查询
统计查询使用count方法,语法如下
db.comment.count(query,option) |
- 例如统计comment中所有记录数:
> db.comment.count() |
- 统计userid为1003的记录数
> db.comment.count({userid:"1003"}) |
5.2 分页列表查询
可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据
基本语法如下所示:
db.集合名.find().limit().skip() |
- 返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20,如下查看前三条数据:
> db.comment.find().limit(3) |
- skip方法同样接受一个数字参数作为跳过记录条数,即前N个不要,默认值是0,如下查询时跳过前三条数据:
> db.comment.find().skip(3) |
- 分页查询:要求:每页两个,第二页开始:跳过前两条数据,接着显示3和4条数据,以此类推
#显示第一页,每页两条数据 |
可以看到显示第三页的时候数据不足两条,则只返回一条
5.3 排序查询
sort()方法对数据进行排序,sort()方法可以通过参数指定排序字段,并使用1和-1来指定排序的方式,其中1为升序排序,-1为降序排序
语法如下:
db.集合名.find().sort({KEY1:1,KEY2:-1}) |
- 对userid升序排序,并对点赞数进行降序排序
> db.comment.find({},{userid:1,likenum:1}).sort({userid:1,likenum:-1}) |
这里数据降序看不出来,理论上userid为1003的那两个数据likenum会进行降序排列
6. 文档的更多查询
6.1正则的复杂条件查询
Mongodb的模糊查询是通过正则表达式的方式实现的,格式为:
db.集合名.find({字段:/正则表达式/}) |
提示:正则是js的语法
- 现在要查询评论内容包含“阳光明媚”的所有文档
#因为上面创建的文档只有一条记录有“阳光明媚”,所以再更新其他一条让它有两条该数据,方便我们查询 |
- 查询以数字开头的评论
> db.comment.find({content:/^[0-9]/}) |
6.2 比较查询
<,<=,>,>=这些操作符也是很常用的,格式如下:
db.集合名.find({字段:{$gt:数值}}) #大于 |
- 查询评论点赞数大于700的记录
> db.comment.find({likenum:{$gt:700}}) |
6.3 包含查询
包含使用$in操作符
- 查询评论的集合中userid字段包含1003和1004的文档
> db.comment.find({userid:{$in:["1003","1004"]}}) |
- 不包含使用$nin操作符
查询评论集合中userid字段不包含1003和1004的文档
> db.comment.find({userid:{$nin:["1003","1004"]}}) |
6.4 条件连接查询
我们如果需要查询同时满足两个以上条件,需要使用$and操作符进行关联。(相当于SQL里的and)
格式为:
db.集合名.find({$and:[{ },{ },{ }]}) |
- 查询评论集合中likenum大于等于700且小于2000的记录
> db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]}) |
如果两个以上条件之间是或者的关系,我们使用操作符进行关联,与前面and的使用方式相同格式为:
db.集合名.find({$or:[{ },{ },{ }]}) |
查询评论集合中userid为1003,或者点赞数小于1000的文档记录:
> db.comment.find({$or:[{userid:"1003"},{likenum:{$lt:NumberInt(1000)}}]}) |
7. 常用命令小结
选择切换数据库:use articledb |

