简介: MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可拓展的高性能数据存储解决方案。
Docker安装MongoDB
镜像地址:https://hub.docker.com/_/mongo?tab=tags
docker pull mongo:latest
#创建容器
docker run --name=mongodb -p 27017:27017 -v /usr/local/mymongo:/data/db(主机文件目录:容器文件目录) mongo:latest(镜像)
use
docker run --name=mongodb -p 27017:27017 -v /usr/local/mymongo:/data/db mongo:latest
#启动容器
docker start mongodb
#进入容器
docker exec -it mongodb /bin/bash
#使用mongoDB 客户端进行操作
mongo
show dbs # 查询所有数据库
MongoDB 基本操作
SQL术语/概念 mongoDB术语/概念 解释/说明
database database 数据库
table collection(table) 数据库表/集合
row document 数据记录/文档
column field 数据字段/域
index index 索引
table joins 表连接,mongodb不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键
show dbs # 查询所有数据库
#通过use关键字切换数据库
use admin
#创建数据库
use testdb #切换数据库
db.user.insert({id:1,name:‘test’}) #插入数据
show dbs #可以看到testdb 数据库
#查看表
show tables
#删除集合(表)
#删除数据库
db.dropDatabase()
db.user.save({id:1,name:‘list’,age:20})
#更新数据
db.collection.update(
,
[
upsert:,
multi: ,
writeConcern:
]
)
参数说明:
query: update的查询条件,类似sql update的where后面的语句
update: update的对象和一些更新的操作符(如,inc…)等,也可以理解为sql update的set后面语句
upsert:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew , true为插入,默 认是false,不插入
multi:可选,mongodb默认是false, 只要找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
writeConcern:可选,抛出异常的级别
db.user.update({id:1},{ KaTeX parse error: Expected 'EOF', got '}' at position 16: set:{name:'张三'}}̲) 只修改name db.u…set:{age:5}}) 更新不存在字段会新增该字段
db.user.update({id:1},{ KaTeX parse error: Expected 'EOF', got '}' at position 12: set:{age:1}}̲,true) 第三个参数为tr…set:{age:2}},false,true) 第四个参数为true,全部更新
#删除数据
通过 remove() 删除数据
db.clloction.remove(
,
{
justOne:,
writeConcern:
}
)
参数说明:
query:(可选) 删除的文档的条件
justOne:(可选) 如果设为true 或1 ,则只删除一个文档,如果不设置该参数,或默认使用false,则删除所有匹配文件的文档
writeConcern:(可选)抛出异常的级别
db.user.remove({id:1}) #删除id=1的数据
db.user.remove({id:1},true) #删除id=1的一条数据
为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作
db.user.deleteOne({id:1})
db.user.deleteMany({}) #删除所有数据
#查询数据
MongoDB 查询数据的语法格式如下:
db.user.find([query]+[fields])
query: 可选,使用查询操作符
fields: 可选,使用投影操作符指定返回的键,查询时返回文档中所有键值,只需要省略该参数即可(默认省略)
如果你需要易读的方式l爱读取数据,可以使用pretty()方法,语法格式如下:
db.col.find().pretty()
db.user.find({},{id:1,name:1}) #查询id,name, id:1=id:true
db.user.find({},{id:1,name:1}).cout() #获取数量
db.user.find({id:1}) #查询id=1的数据
db.user.find({id:1}).pretty() #美化输出
db.user.find({id:{ KaTeX parse error: Expected 'EOF', got '}' at position 6: lte:2}̲}) #查询小于等于2的数据…lte:15},id:{ KaTeX parse error: Expected 'EOF', got '}' at position 6: gte:2}̲}) #and查询,age小于…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}) #按照id倒序排序,-1为倒序,1为正序
#索引
#获取索引
db.user.getIndexes()
[
{
“v” : 2, #版本
“key” : {
“_id”(索引字段名) : 1(正序)
},
“name” : “id”,(索引名字)
“ns” : “testdb.user”(命名空间)
}
]
#创建索引
db.user.createIndex({age:1})
#删除索引
db.user.dropIndexes(‘age_1’)
#创建联合索引
db.user.createIndex({age:1,id:-1})
#查看索引大小,单位:字节
> db.user.totalIndexSize()
#执行计划
for(var i=1;i<1000;i++) db.user.insert({id:100+i,username:‘name_’+i,age:10+i})
db.user.find().explain()
{
“queryPlanner” : {
“plannerVersion” : 1,
“namespace” : “testdb.user”,
“indexFilterSet” : false,
“parsedQuery” : {
},
"queryHash" : "8B3D4AB8",
"planCacheKey" : "8B3D4AB8",
"winningPlan" : {# 最佳执行方案
#查询方式: 'COLLSCAN'/全表扫描(最慢),'IXSCAN'/索引扫描
# FETCH/根据索引去检索文档 SHARD_MERGE/合并分片结果
#IDHACK/针对_id进行查询
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "c15834ba9dd2",
"port" : 27017,
"version" : "4.2.6",
"gitVersion" : "20364840b8f1af16917e4c23c1b5f5efd8b352f8"
},
"ok" : 1
}
db.user.find({age:{ KaTeX parse error: Expected 'EOF', got '}' at position 8: gt:1000}̲,id:{ lt:20}}).explain()
db.user.find({_id:“5ec93673718c74ceeb87fcc5”}).explain() #最快,使用IDHACK
UI客户端工具
因为我用的是最新版的mongodb,索引使用客户端工具为 Robo 3T 1.3.1
$mongod --auth 开启验证
use admin
db.createUser({user:“admin”,pwd:“123456”,roles:[“dbAdminAnyDatabase”]}) #添加用户
monod --port 27018 #更换端口