MongoDB快速入门
MongoDB是什么
先来看一段百度百科上面的解释:
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB的特点
百度百科解释
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:面向集合存储,易存储对象类型的数据。
模式自由。支持动态查询。支持完全索引,包含内部对象。支持查询。支持复制和故障恢复。使用高效的二进制数据存储,包括大型对象(如视频等)。自动处理碎片,以支持云计算层次的扩展性。支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。文件存储格式为BSON(一种JSON的扩展)。*可通过网络访问。
MongoDB不适用以下场景
1)要求高度事务性的系统。
2)传统的商业智能应用。
3)复杂的跨文档(表)级联查询。
概念总结:nosql数据库的一种,区别于关系型数据库,使用二进制数据进行存储。
环境准备:Docker安装MongoDB
docker安装步骤:
更新yum源
yum 源更新进入源目录:cd /etc/yum.repos.d/
下载163源:wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
把文件里面的releasever#6#g' CentOS6-Base-163.repo
清除原有缓存:yum clean all
重建缓存,以提高搜索安装软件的速度:yum makecache
更新系统:yum update
安装docker
卸载旧版本:# yum remove docker docker-common docker-selinux
安装需要的依赖包:# yum install -y yum-utils device-mapper-persistent-data
配置稳定仓库:# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装:# yum install docker-ce
启动docker:# systemctl start docker
加入开机启动:# systemctl enable docker
验证安装是否成功:# docker -v
安装MongoDB
拉取镜像
docker pull mongo:4.0.3
创建容器
docker create --name mongodb -p 27017:27017 -v /data/mongodb:/data/db mongo:4.0.3
启动容器
docker start mongodb
进入容器
docker exec -it mongodb /bin/bash
使用MongoDB客户端进行操作
如上图,输入mongo即可连入MongoDB的客户端进行操作了
show dbs #查询所有的数据库
admin 0.000GB
config 0.000GB
local 0.000GB
MongoDB基础概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | filed | 数据字段/域 |
index | index | 索引 |
table joins | 表连接/MongoDB不支持 | |
primary key | primary key | 主键/MongoDB自动将_id设置为主键 |
数据库以及表操作
查看所有的数据库
show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
通过use关键字切换正在使用的数据库
use admin
switched to db admin #提示已经切换成功了
创建数据库
说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
use testdb
show dbs
注意!这个时候是看不到数据库的,只有数据库里面存在了数据后才能够显示数据库
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
现在我们来让这个testdb数据库显示出来
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
use testdb
switched to db testdb
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
db.user.insert({id:1,name:'zhangsan'}) #插入一条数据
WriteResult({ "nInserted" : 1 })
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testdb 0.000GB
这样我们的testdb数据库才会创建成功
查看表
show collections
user
还记得我们在上面执行了一条db.user.insert({})语句吗?这条语句的含义就是在testdb里面创建了一个集合并且往里面插入了一条数据。
删除集合
db.user.drop()
true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
删除数据库
use testdb #切换数据库
switched to db testdb
db.dropDatabase() #删除数据库
{ "dropped" : "testdb", "ok" : 1 }
show dbs #显示存在的数据库
admin 0.000GB
config 0.000GB
local 0.000GB
新增数据
在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
插入数据
语法:db.COLLECTION_NAME.insert(document)
如:
db.user.insert({id:1,username:'zhangsan',age:20})
WriteResult({ "nInserted" : 1 })
db.user.find() #查询数据
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "id" : 1, "username" : "zhangsan", "age" : 20 }
更新数据
db.collection.update(
<query>,
<update>,
[
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
]
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如 inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是
false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条
记录全部更新。
writeConcern :可选,抛出异常的级别。
示例
更新方式一:
db.user.find() #查询数据
2019-08-26T07:16:30.762+0000 E QUERY [js] SyntaxError: illegal character @(shell):1:15
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "id" : 1, "username" : "zhangsan", "age" : 20 }
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "id" : 1, "username" : "zhangsan", "age" : 20 }
db.user.update({id:1},{$set:{age:22}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "id" : 1, "username" : "zhangsan", "age" : 22 }
更新方式二:更新去掉其他字段
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "id" : 1, "username" : "zhangsan", "age" : 22 }
db.user.update({id:1},{age:25}) #注意前后字段变化,这种会把其他字段给去掉
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25 }
更新方式三:更新不存在的字段会新增字段
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25 }
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25 }
db.user.update({age:25},{$set:{sex:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
更新方式四:更新不存在的数据,默认不会新增数据
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
db.user.update({id:3},{$set:{sex:1}})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
如果设置第一个参数为true,就是新增数据,如:
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
db.user.update({id:3},{$set:{sex:1}},true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5d638bc6d51635c116f37ce8")
})
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
{ "_id" : ObjectId("5d638bc6d51635c116f37ce8"), "id" : 3, "sex" : 1 }
删除数据
通过remove()方法进行删除数据,语法如下
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删
除所有匹配条件的文档。
writeConcern :(可选)抛出异常的级别。
db.user.find()
{ "_id" : ObjectId("5d638702ef4c94254d13372c"), "age" : 25, "sex" : 1 }
{ "_id" : ObjectId("5d638bc6d51635c116f37ce8"), "id" : 3, "sex" : 1 }
db.user.remove({age:25})
WriteResult({ "nRemoved" : 1 })
db.user.find()
{ "_id" : ObjectId("5d638bc6d51635c116f37ce8"), "id" : 3, "sex" : 1 }
删除所有数据
db.user.remove({})
说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作。
db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据
查询数据
MongoDB 查询数据的语法格式如下:
db.集合名.find([query],[fields])
query :可选,使用查询操作符指定查询条件
fifields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省
略)。
示例
插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})
db.user.find() #查询全部数据
db.user.find({},{id:1,username:1}) #只查询id与username字段
db.user.find().count() #查询数据条数
db.user.find({id:1}) #查询id为1的数据
db.user.find({age:{lte:21}, id:{or:[{id:1},{id:2}]}) #查询id=1 or id=2
分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
db.user.find().sort({id:-1}) #按照age倒序排序,-1为倒序,1为正序
索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取
那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站
的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排
序的一种结构
查看索引
db.user.getIndexes()
创建索引
db.user.createIndex({'age':1})
删除索引
db.user.dropIndex("age_1")
或者,删除除了_id之外的索引
db.user.dropIndexes()
创建联合索引
db.user.createIndex({'age':1, 'id':-1})
查看索引大小,单位:字节
db.user.totalIndexSize()
执行计划
MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具
插入1000条数据
for(var i=1;i<1000;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})
查看执行计划
db.user.find({age:{lt:200}}).explain()
我们主要关注下图中标红的部分,比如我们没有建立索引,所以现在是全表扫描,可以试试上面的创建索引再查看执行计划。
"stage" : "FETCH", #查询方式,
常见的有COLLSCAN/全表扫
IXSCAN/索引扫描
FETCH/根据索引去检索文档
SHARD_MERGE/合并分片结果
IDHACK/针对_id进行查询
参考:博学谷-->MongoDB入门
有疑问加站长微信联系(非本文作者)