MongoDB菜鸟入门:docker搭建单机MongoDB

2023-05-2408:38:55数据库教程Comments2,095 views字数 3210阅读模式

数据库受欢迎程度排行榜中,MongoDB一直居于前五。对于没有了解过MongoDB的朋友可能觉得MySQL就能满足日常业务,如果不行,还可以使用缓存、es等。但是MongoDB也有自己的独到之处,而且越来越多的公司与业务都在使用MongoDB。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

MongoDB简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

MongoDB优势

  • json数据结构,可以节省数据库结构的设计和ORM层编码的开发。
  • 可以更加专注于业务编程,花更少的时间在数据库设计方面。
  • 灵活的数据结构,可以快速响应业务需求的变化
  • 从4.0开始,MongoDB已经支持事务

对比关系型数据库

标题MongoDBRDBMS
数据模型文档模型关系模型
高可用复制集集群模式
横向扩展能力通过原生分片完善支持数据分区或者应用侵入
索引支持B+树,全文索引,地理位置索引,多键索引,TTL索引B+树
数据容量没有理论上线千万,亿
扩展方式垂直扩展+水平扩展垂直扩展

MongoDB数据模型

MongoDB最小存储单位就是文档(document)对象。类似于关系型数据库的行。数据在MongoDB中以BSON(Binary-json)文档的格式存储在磁盘上。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

BSON是一种类json的二进制形式的存储格式。支持内嵌的文档对象和数组对象。具有轻量型、可遍历性、高效性三个特点,可以有效描述非结构化数据和结构化数据。这种格式优点是灵活性高,缺点是空间利用率不是很理想。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

BSON格式缺点

正所谓成也萧何败也萧何。上面说到BSON格式优点是灵活性高,缺点是空间利用率不是很理想。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

空间利用率可以忽略,多费点硬盘空间而已。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

灵活性高,可以使业务变更更容易,但是也注定了对数据结构的约束很难。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

docker搭建单机MongoDB

shell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html
复制代码
#安装MongoDB容器

#-e MONGO_INITDB_ROOT_USERNAME创建管理员账号

#-e MONGO_INITDB_ROOT_PASSWORD=123456创建密码

docker run -d -p 27017:27017 --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo:5.0.9

#进入容器

docker exec -it mongodb /bin/bash

#登录mongo,登录的数据库是admin数据库

mongo localhost:27017 -u 'admin' -p '123456' --authenticationDatabase 'admin'

#创建数据库shop

use shop

#创建用户

#账号:root

#密码:123456

#角色:root

#管理数据库:admin

db.createUser({ user: 'sh', pwd: '123456', roles: [ { role: "dbOwner", db: "shop" } ] });

#插入数据
> db.shop.insert({name:123})
WriteResult({ "nInserted" : 1 })

MongoDB语法

新增

db.shop.insert({name:123})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

查询

MySQLMongoDB
a=1{a:1}
a<>1{a:{$ne:1}}
a>1{a:{$gt:1}}
a>=1{a:{$gte:1}}
a<1{a:{$lt:1}}
a<=1{a:{$lte:1}}
a=1 and b=1{a:1,b:1}或者{$and:[{a:1},{b:1}]}
a=1 or b=1{$or:[{a:1},{b:1}]}
a is null{a:{$exists:false}}
a in (1,2,3){a:{$in:[1,2,3]}}
a not in (1,2,3){a:{$nin:[1,2,3]}}
a like '%哈%'{a:/哈/}

删除

//删除name = 张三的记录
db.shop.remove({name:"张三"})
//删除age >= 35的记录
db.shop.remove({age:{$gte:35}})
//删除所有记录 db.shop.remove({})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

修改

//修改第一条记录 update shop set age =35 where name="张三" limit 1; db.shop.updateOne({name:"张三"},{$set:{age:35}})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

//和上面一样只修改第一条
db.shop.update({name:"张三"},{$set:{age:35}})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

//修改多条 update shop set age =35 where name="张三"
db.shop.updateMany({name:"张三"},{$set:{age:35}})文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

条件说明
$set修改对象属性值
$push增加一个对象到数组
$pushAll增加多个对象到数组
$pop从数组底部删除一个对象
$pull如果匹配指定的值,从数组删除相应的对象
$pullAll如果匹配任意的值,从数组删除相应的对象
$addToSet如果不存在则增加一个到数组

聚合框架(Aggregation)

聚合操作处理数据记录并返回结果。
MongoDB提供了三种执行聚合的方法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

  • 聚合管道(Aggregation Pipeline)
  • map-reduce函数
  • 单一目的聚合方法

可以实现类似于mysql的group by、left join 等操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

聚合管道(Aggregation Pipeline)是以数据处理流水线的概念为基础。文档进入一个多阶段的流水线,将文档转化为一个聚合的结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

MongoDB菜鸟入门:docker搭建单机MongoDB文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

shell文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html
复制代码
> db.shop.remove({})
WriteResult({ "nRemoved" : 1 })
>
> db.shop.insert({id:1,amount:100,status:1})
WriteResult({ "nInserted" : 1 })
> db.shop.insert({id:2,amount:200,status:1})
WriteResult({ "nInserted" : 1 })
> db.shop.insert({id:3,amount:300,status:1})
WriteResult({ "nInserted" : 1 })
> db.shop.insert({id:4,amount:400,status:2})
WriteResult({ "nInserted" : 1 })
> db.shop.count()
4
> db.shop.aggregate([{$match:{status:1}},{$group:{_id:"$id",total:{$sum:"$amount"}}}])
{ "_id" : 3, "total" : 300 }
{ "_id" : 1, "total" : 100 }
{ "_id" : 2, "total" : 200 }
>

常见步骤文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html

功能MQLSQL
过滤$matchwhere
投影$projectas
排序$sortorder by
分组$groupgroup by
结果大小$skip$limitlimit
左外连接$lookupleft join
展开数组$unwind
图搜索$graphLookup
分面搜索$facet$bucket
作者:越走越远的风
链接:https://juejin.cn/post/7235815625712435259
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/41763.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/41763.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定