数据库相关
数据库安装和配置
安装之后需要配置环境变量;
验证:mongo命令是否有效
启动服务端:
- C:User\Admintor(任意地址)> mongod --dbpath D:\DevelopSoft\mongolog;
说明:--dbpath 就是选择数据库文档所在的文件夹,后面还可以附加--port 端口号从而指定启动端口(否则默认是27017) - 如果在c盘根目录下新建data/db两级目录,则可以直接使用mongod启动数据库,但是如果这两级目录不存在则报错
- mongod:是开启数据库,不能关闭,一旦这个cmd关闭,数据库就关闭了
- 启动客户端:然后另外开启一个cmd,运行mongo连接数据库
查看
查看当前数据库名称:db
查看所有数据库:show dbs
切换数据库:use 数据库名称 (如果数据库不存在,则指向数据库,但不创建
直到插入数据或创建集合时数据库才被创建)
默认数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中
删除数据库:db.dropDatabase() 删除的时当前数据库
结构说明
数据库->集合collection(可以多个)->文档document(可以多个,文档和文档之间没有联系)
集合相关
创建集合
db.createCollection(name,options)
name时要创建的集合的名称
options是一个文档,用于指定集合的配置,但是此配置可以没有,就代表无限制
限制集合大小
db.createCollection("sub",{capped:true,size:10})
capped :默认是false表示不设置上限,值true表示设置上限
size: 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限
时,会将之前的数据覆盖,单位为字节
查看当前数据库的集合
show collections
删除
db.集合名称.drop()
数据类型
Object ID:文档id 不需要维护,作为主键
String:字符串,必须是有效的utf-8
Boolean:存储一个布尔值 true或false
Integer:整数可以是32或64位,这取决于服务器
Double:存储浮点数
Arrays:数组或列表,多个值存储到一个键
Object:用于嵌入式的文档,即一个值为一个文档
Null:存储null值
Timestamp:时间戳
Date:存储当前日期或时间的UNIX时间格式
插入
- 插入一个文档对象/只能是一个对象
db.colletion.insertOne() - 插入多个文档对象/只能是数组
db.colletion.insertMany() - 插入一个或者多个/数组或者对象
db.colletion.insert()
db.集合名称.insert(document)
插入文档时候,如果不指定_id参数,mongdb会为文档分配一个唯一的objectid
案例:
栗子1:db.stu.insert({name:'a',gender:1})
栗子2:
s1={_id:'20160101',name:'hr'}
s1.gender=0
db.stu.insert(s1)
# 插入多个(传入的是数组)
db.hehe.insert([{info:"asa"},{name:"asas"}])
# 简单查询
db.集合名称.find()
- 查询,如果多个则只显示第一个
db.colletion.findOne({name:"b"})
- 查询,返回的是数组,所以可以利用[]索引
db.colletion.find({name:"b"})[0]
- 还可以在find的结果后面加上,count()/length()等方法
db.colletion.find({name:"b"}).length()
# 更新
db.集合名称.update(
<query>,
<update>,
{multi:<boolean>}
)
参数query:查询条件,类似sql语句update中的where部分
参数update:更新操作符,类似sql语句中的set部分
参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示条件满足的全部更新
- 默认会使用新对象替换旧对象(默认只会替换一个),此时参数二替换了参数一在数据库中
db.colletion.update({name:"b"},{age:20})
解决方案1:这样就只会更新对应的属性,还不是替换
db.colletion.update({name:"b"},{$set:{age:20})
解决方案2:或者使用replaceOne,其不会整体替换
db.collection.replaceOne({name:"sdc"},{name:"sdasa"})
- 只修改第一个符合条件的文档
db.colletion.updateOne()
- 同时修改符合多个条件的文档
db.colletion.updateMany()
栗子1:全文档更新,参数一为空,表示全部数据都匹配
db.stu.update({},{name:'mnc'})
此时只修改了第一条,但是第一条数据整个文档结构都变了
例如:修改前时{"_id":ObjectId("523bjj24bk23"),"name":"gj1","gender":true}
修改之后:{"_id":ObjectId("523bjj24bk23"),"name":"gj1"}
为了避免上面的情况,通过$set进行指定属性的更新
先插入一条数据:db.stu.insert({name:"hr",gender:0})
修改:db.stu.update({name:'hr'},{$set:{name:'hys'}})
这样修改就不会造成,整个文档的改变
修改多条匹配到的数据
db.stu.update({},{$set:{gender:0}},{multi:true})
- $unset是根据参数一匹配,然后删除匹配到的第一条的name:"asdcjnacsasca"属性,注意不是删除整条,而且只匹配第一条age:20的document
db.colletion.update({age:20},{$unset:{name:"asdcjnacsasca"}})
保存
db.集合名称.save(document)
如果文档的_id已经存在则是修改,如果文档_id不存在则添加
栗子:db.stu.save({_id:'20160102','name':'zq',gender:1})
删除
db.集合名称.remove(
<query>,
{
justOne:<boolean>
}
)
query:可选,删除的文档的条件
justOne:可选,如果设为true或1,则只删除一条,默认false,删除多条
栗子:
删除第一条:db.stu.remove({gender:0},{justOne:true})
全部删除:
db.stu.remove({}) 一条条删除,性能低
db.stu.drop() 整体删除,性能高
- 只删除一个符合条件的文档
- db.collection.deleteOne()
- 删除所有符合的文档
db.collection.deleteMany()
查询
db.集合名称.find({条件文档})
db.集合名词.findOne({条件文档}) 只返回第一个
db.集合名称.find({条件文档}).pretty() 将结果格式化
补充
- 多级结构
db.hehe.insert(
[
{
name:"asads",
fav:{
movie:["a","b"]
}
}
]
)
- 给movie新加一个"星际穿越"
db.hehe.update({name:"asads"},{$push:{
"fav.movie":"星际穿越"
}})
说明:$set是整体替换,但是此时想新增,所以使用$push
还有Bson支持.的形式调用,但是必须被“”包裹起来。
同理还有$pop,$pull,$addToSet(和$set相似,但是不能重复添加)),$pushAll.$pullAll
图一.png
-
插入两万条数据
var infos=[]
for(var i=0;i<20000;i++){
infos.push({age:i})
}
db.hehe.insert(infos)
这样想比与一条条插入性能高了很多 -
查询年纪在20和50之间的数据
db.hehe.find({age:{lt:50}}) -
修改年纪为1的数据增加20(如果减20则age:-20即可)
db.hehe.updateMany({age:1},{$inc:{age:20}})
运算符
等于 默认是等于判断,没有运算符
小于lte
大于 gte
不等于 gte:18}})
逻辑运算符
查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:默认是逻辑与的关系
栗子:查询年级大于等于18,并且性别为1的学生
db.stu,find({age:{$gte:18},gender:1})
逻辑或:使用or:[{age:{$gt:18}},{gender:1}]})
and和or一起使用
查询年龄大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({gt:18}},{gender:1}],{name:'gj'})
范围运算符
使用nin判断是否在某个范围
查询年龄为18,28的学生,注意不是区间,指的是18/28只要有一个就符合
db.stu.find({age:{$in:[18,28]}})
全部匹配all
使用all:[18,28]}})
正则表达式
使用//或regex:'^黄'}})
自定义查询
使用where:function(){return this.age>20}})
数据查询
方法limit():用于读取指定数量的文档
db.集合名称.find().limit(number)
参数number表示要获取的文档的条数,如果不指定则显示所有
查询2条学生的数据
db.stu.find().limit(2)
方法skip():用于跳过指定数量的文档
db.集合名称.find().skip(number)
参数number表示跳过的记录条数,默认是0
查询从第三条开始的学生信息
db.stu.find().skip(2)
上面两个可以一起使用,不分先后顺序
查询第5至8条数据
db.stu.find().limit(4).skip(5)或
db.stu.find().skip(5).limit(4)
投影
在查询到得返回结果中,只选择必要得字段,而不是选择一个文档的整个字段
参数为字段与值,值为1表示显示,值为0不显示
db.集合名称.find({},{字段名称:1,.....})
排序
db.集合名称.find().sort({字段:1,....})
参数1为升序排列
参数-1为降序排列
栗子:db.stu.find().sort({gender:-1,age:-1})
统计个数
方法count()用于统计结果集中文档条数
db.集合名称.find({条件}).count()
或者
db.集合名称.count({条件})
消除重复
方法distinct()对数据去除重复
db.集合名称.distinct('去重字段',{条件})
栗子:查找年龄大于18的性别(去重)
db.stu.distinct(gender,{age:{$gt:18}} )
高级操作
聚合 aggregate
db.集合名称.aggregate([{管道:{表达式}])
常用管道:
match: 过滤数据,只输出符合条件的文档
sort:将输入文档排序后输出
skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数组类型的字段进行拆分
针对Mongodb4.x
安装
- 新增选择是网络用户还是本地用户
- 会选择log文件夹和文件文件夹
- 而且会注册系统服务,不需要在mongod手动开启服务端
Mongdb账户权限配置
默认是全部开启,不需要用户名和密码,不安全
- 创建超级管理员
use admin
db.createUser({
user:'admin',
pwd:'123456',
roles:[{role:'root',db:'admin'}]
})
- 修改Mongodb数据库配置文件
D:\DevelopSoft\MongoDB\bin\mongod.cfg
配置:security:
authorization: enabled 注意空格和编码以及换行符
- 修改配置文件后重新启动mongodb服务
- 使用超级管理员连接数据库
mongo admin -u 用户名 -p 密码
mongo 192.168.0.117:27017/test -u user -p password //远程连接
- 创建指定用户,只能访问指定数据库
use zengqiangdb
db.createUser({
user:'zengqiang',
pwd:'123456',
roles:[{role:'dbOwner',db:'zengqiangdb'}]
})
数据库角色
- 数据库用户角色: read readWriter
- 数据库管理角色: dbAdmin dbOwner userAdmin
- 集群管理角色: clusterAdmin clusterManager cluserMonitor hostManager
- 备份恢复角色: backup restore
- 所有数据库角色: readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase
- 超级用户角色: root
相关命令
- show users:查看当前库的管理员
- db.dropUser("zengqiang"):删除管理员
- db.updateUser("zengqiang",{pwd:"password"}):修改用户密码
- db.auth("admin","password"):密码认证
例如:直接mongo admin连接不输入任何密码则show dbs是无效的,此时可以通过密码认证完成密码认证再show dbs等操作即可有效
网友评论