目录
前言
很多企业都在使用mongdb,因此学习mongdb是非常有用的,今天就在这篇文章中记录一下常用的mongodb的命令,毕竟好记性不如烂笔头。
一、数据库
1.启动mongodb
mongod --dbpath=..\data\db #--dbpath指定启动的服务的db存储路径
2.连接服务
mongo --host=127.0.0.1 --port=27017
如果不指定地址,也是可以的,会自动寻找本地的mongodb服务进行连接。
3.查看数据库
show dbs
4.切换数据库
use db #如果数据库不存在会自动创建
这里需要说明,当我们切换一个不存在的数据库时,会自动创建一个新的数据库,但是此时数据库是存放在内存当中,并没有持久化到磁盘中,所以此时使用show dbs查看,是没有这个新的数据库的,只有这个数据库中存在一个集合,这个库才会持久化到磁盘中。
5.查看当前使用的数据库
db
6.删除数据库
db.DropDatabase()
二、集合(表)
1.创建集合
- 显示创建
db.createCollection("demo") #创建名为demo的集合
2.删除集合
db.demo.drop() #demo是要删除的集合名称
3.查看集合
show collections
三、文档(行数据)
1.插入文档
db.stu.insert({"name":"zhangsan","age":"18","creted_time":new Date()}) #在stu集合中插入一个文档
db.stu.insertMany([{"name":"zhangsan","age":"18","creted_time":new Date()},
{"name":"lisi","age":"19","creted_time":new Date()},
{"name":"wangwu","age":"20","creted_time":new Date()},
{"name":"zhaoliu","age":"21","creted_time":new Date()},
]) #在stu集合中插入多个文档
2.查询
db.stu.find() #查询stu集合的所有文档
db.stu.find({"name":"zhangsan"}) #查询stu集合中name为zhangsan的文档
db.stu.findOne({"name":"zhangsan"}) #查询stu集合中name为zhangsan的文档,结果只返回第一条数据
3.投影查询
这里其实就是MySQL中的select具体字段,而不是select *
db.stu.find({"name":"zhangsan"},{age:1})) #查询结果只显示age字段
db.stu.find({"name":"zhangsan"},{age:1,_id:0})) #查询结果只显示age字段,排除id
4.更新
- 单条更新
#将主键为1的文档的age更新为50
db.stu.update({_id:"1"},{age:"50"}) #覆盖更新
db.stu.update({_id:"2"},{$set:{age:"30"}}) #只修改文档的age字段
覆盖更新的方式会导致当前文档只剩下age字段。
另外说明mongodb默认只修改一条数据,如果符合查询条件的数据有多条,那么也只会修改第一条。
- 批量修改命令如下:
#将所有name为张三的年龄修改为28
db.stu.update({name:"zhangsan"},{$set:{age:NumberInt(28)}},{multi:true})
NumberInt(28)将默认的double类型转为int32类型,如果不进行转换,那么默认存储类型为浮点数。
- 列值增长修改
#让张三的age+1
db.stu.update({name:"zhangsan"},{$inc:{age:NumberInt(1)}}) #修改第一条
5.删除
- 指定条件删除
#删除所有name为zhangsan的文档
db.stu.remove({name:"zhangsan"})
- 删除所有
db.stu.remove({})
6.统计查询
- 统计文档数量
db.stu.count()
- 按条件统计
db.stu.count({name:"zhangsan"})
7.分页查询
- 基本语法
db.集合名.find().limit(返回数量).skip(跳过数量)
- 示例
#查询stu集合,返回前两条数据
db.stu.find().limit(2)
#查询stu集合,跳过前三条数据
db.stu.find().skip(3)
8.排序查询
- 基本语法
db.集合名.find().sort({key:1,key2:1,key3:1,...})
- 示例
#stu集合根据age升序排序
db.stu.find().sort({age:1})
#stu集合根据age降序排序
db.stu.find().sort({age:-1})
#投影查询,stu集合根据age升序排序
db.stu.find({},{age:1}).sort({age:1})
9.模糊查询
- 基本语法
db.集合名.find({field:/正则表达式/})
- 示例
#查询stu中name包含i的记录
db.stu.find({name:/i/})
#查询stu中name以i开头的记录
db.stu.find({name:/^i/})
10.比较查询
- 基本语法
#field > value
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}})
这里需要注意的是:如果是int类型的比较,需要使用类型转换函数NumberInt()进行转换;另外,需要字段的类型也是int类型。
11.包含查询
#stu集合中age在20,21的
db.stu.find({age:{$in:["20","21"]}})
#stu集合中age不在在20,21的
db.stu.find({age:{$nin:["20","21"]}})
12.条件连接查询
- 基本语法
$and:[{条件1},{条件2},...]
- 示例
#查询age=20并且name=zhangsan的文档
db.stu.find({$and:[{age:"20"},{name:"zhangsan"}]})
#查询age=20或者name=zhaoliu的文档
db.stu.find({$or:[{age:"20"},{name:"zhaoliu"}]})
#查询age大于20并且name=zhaoliu的文档
db.stu.find({$and:[{age:{$gt:NumberInt(20)}},{name:"zhaoliu"}]})
四、索引
mongodb索引使用的是B树。
1.索引类型
- 单字段索引:在文档的单个字段上创建用户定义的升序降序索引。索引键的排序顺序不重要,mongodb可以在任何方向上遍历索引。
- 复合索引:对文档中多个字段进行排序,复合索引中的字段排序具有先后顺序,假设索引:{userid:1,score:-1},则索引先按照userid正序排序,再按照score倒序排序。
- 地理空间索引
- 文本索引:
- 哈希索引:只支持等值匹配,不支持范围查询
2.查看索引
db.集合名.getIndexes()
3.创建索引
#给userid,score添加索引
db.集合名.createIndex({userid:1,score:1})
4.删除索引
#删除userid索引
db.集合名.dropIndex({userid:1})
#通过索引名删除索引
db.集合名.dropIndex("userid_1")
#删除所有索引
db.集合名.dropIndexes()
五、执行计划
1.查看执行计划
db.集合名.find(query,options).explain(options)
#查看根据userid查询的执行计划
db.stu.find({userid:"1001"}).explain()
在结果中,主要关注winningPlan:
如果stage为collscan就说明是全集合扫描,fetch为抓取,就表明使用到了索引。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了mongodb的基本命令的使用。