MongoDB泛览

数据库相关

数据库安装和配置


安装之后需要配置环境变量;
验证: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:{gt:20,lt:50}})

  • 修改年纪为1的数据增加20(如果减20则age:-20即可)
    db.hehe.updateMany({age:1},{$inc:{age:20}})

运算符


等于 默认是等于判断,没有运算符
小于lt 小于等于lte
大于 gt 大于等于gte
不等于 ne 栗子:查询年龄大于或等于18 的学生 db.stu.find({age:{gte:18}})


逻辑运算符


查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:默认是逻辑与的关系
栗子:查询年级大于等于18,并且性别为1的学生
db.stu,find({age:{$gte:18},gender:1})

逻辑或:使用or 查询年级大于18,或性别为0的学生 db.stu.find({or:[{age:{$gt:18}},{gender:1}]})

and和or一起使用
查询年龄大于18或性别为0的学生,并且学生的姓名为gj
db.stu.find({or:[{age:{gt:18}},{gender:1}],{name:'gj'})


范围运算符


使用in(或),nin判断是否在某个范围
查询年龄为18,28的学生,注意不是区间,指的是18/28只要有一个就符合
db.stu.find({age:{$in:[18,28]}})


全部匹配all


使用all(且),代表全部匹配,必须18,28两个数据都匹配上,刚好和上面的in是一个是或一个是且 db.stu.find({age:{all:[18,28]}})


正则表达式


使用//或regex编写正则表达式 查询姓黄的学生 db.stu.find({name:/^黄/}) db.stu.find({name:{regex:'^黄'}})


自定义查询


使用where后面写一个函数,返回满足条件的数据 查询年级大于30的学生 db.stu.find({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([{管道:{表达式}])
常用管道:
group:将集合中的文档分组,可用于统计结果match: 过滤数据,只输出符合条件的文档
project:修改输入文档的结构,如重命名、增加、删除、创建计算结果sort:将输入文档排序后输出
limit:限制聚合管道返回的文档数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

  • 配置:默认
如下开启后,才必须要求通过账号密码链接,mongodb默认是可以直接链接的
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等操作即可有效

Linux相关

Mongodb4.x 安装

  1. 配置 yum 源


  1. yum 安装 mongodb(会安装 mongodb-org 包及其依赖包mongodb-org-server、mongodb-org-mongos、mongodb-org-shell、mongodb-org-tools)

数据库实例默认在/var/lib/mongo 路径下,日志默认在/var/log/mongodb 路径下,也可以通过修改配置文件/etc/mongod.conf 文件的 storage.dbPath 和 systemLog.path 配置


  1. 安装 mongodb
    • yum install -y mongodb-org
  2. 开启 mongodb 服务
    • systemctl start mongod
  3. 设置开机启动 mongodb
    • systemctl enable mongod
  4. 停止 mongodb 服务
    • systemctl stop mongod
  5. 重启 mongodb 服务
    • systemctl restart mongod

Mongodb4.x 卸载


  1. 停止服务
    • service mongod stop
  2. 删除安装的包
    • rpm -qa | grep mongodb-org 列出所有的包
    • yum remove -y $(rpm -qa | grep mongodb-org)
  3. 删除数据及日志
    • rm -r /var/log/mongodb
    • rm -r /var/lib/mongo

远程连接 mongodb


  1. 修改 mongo.conf 文件
  • 命令:sudo vi /etc/mongod.conf
  • 将原来 bindIp:127.0.0.1 修改为 0.0.0.0
  • (mongodb 的配置文件中的 bind_ip 默认为 127.0.0.1,默认只有本机可以连接。 此时,需要将 bind_ip配置为 0.0.0.0,表示接受任何 IP 的连接。)
  1. 重启动 mongo 服务:service mongod restart
  2. 永久开放 27017 端口:
    • firewall-cmd --zone=public --add-port=27017/tcp --permanent ; (–permanent 永久生效,没有此参数重启后
      失效
    • firewall-cmd --reload

mongodb数据库的导出导入

在 Mongodb 中我们使用 mongodump 命令来备份 MongoDB 数据。该命令可以导出所有数据到指定目录中。 mongodump 命令可以通过参数指定导出的数据量级转存的服务器。使用 mongorestore 命令来恢复备份的数据。

导出:

mongodump -h dbhost -d dbname -o dbdirectory

导入:(dbName对应数据库不存在则会自动创建)

mongorestore -h dbhost -d dbname <path>

如果开启了用户名验证

导入:

mongorestore -u admin -p 123456 -h dbhost -d --authenticationDatabase admin dbname <path>

其中--authenticationDatabase admin代表使用的权限等级

配置 Mongodb4.x 管理员密码(自己查)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 第一章 前言 1.1 知识体系分析 前端工程师:Web前端,也就是在Web应用中用户可以看得见碰得着的东西。包括W...
    whitsats阅读 865评论 0 3
  • 简介 NoSQL : 全名为Not Only SQL, 指的是非关系型的数据库 随着访问量上升, 网站的数据库性能...
    奋斗的老王阅读 3,025评论 4 47
  • 1. MongoDB 简介 MongoDB是一个可扩展的高性能,开源,模式自由,面向文档的NoSQL,基于分布式文...
    rhlp阅读 1,100评论 0 3
  • MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方...
    入戏半分笑阅读 371评论 0 2
  • 1.express node Web应用框架,提供了很多Web应用和HTTP工具 使用express可以快速搭建一...
    昵称不能太随便阅读 1,321评论 0 2