MongoDB学习笔记(自用)
本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除
文章目录
1.简介
1.1数据操作特点
- 数据量大
- 写入操作频繁(读写操作频繁)
- 价值较低的数据(对业务性要求不高)
1.2使用时机
- 应用不需要事务及复杂的join查询
- 新应用(需求易变,数据模型不确定)
- 需要2000-3000以上的QPS(增删改查)
- TB级别的数据存储高可用(副本集:提供自动故障转移和数据冗余)
- 大量的地理位置查询、文本查询
1.3介绍
-
MongoDB是一个开源、高性能、无模式的文档型数据库,是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库。
-
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON(Binary-JSON),所以它既可以存储比较复杂的数据类型,又相当的灵活。
-
MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。
-
体系结构:
Mysql | MongoDB | 说明 |
---|---|---|
table | collection | 表 |
row | document | 记录行 |
column | field | 字段 |
table joins | 嵌入文档 | 多表连接 |
-
对象id: UUID 自动生成
-
Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。
-
这些类型包括date,object id,binary data,regular expression 和code。
2.MongoDB 单机部署
2.1 windows启动服务
1.下载解压
2.启动:
预先手动建立一个目录用于存放数据文件(解压目录/data/db)
- 默认打开方式:在bin目录打开cmd
mongod --dbpath=..\data\db
# 在启动信息中可以看到,mongoDB的默认端口是27017
# 若想要改变启动端口,可以通过–port来指定端口
- 配置打开方式:预先在解压目录中新建 config 文件夹,在该文件夹中新建配置文件 mongod.conf ,写入如下配置
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath: D:\02_Server\DBServer\mongodb-win32-x86_64-2008plus-ssl-4.0.1\data
# 注意遵循yaml书写方式
# dbPath中P大写
启动:
mongod -f ..\config\mongod.conf
mongod --config ..\config\mongod.conf # 二选一即可
2.2 shell命令连接数据库
新版MongoDB不自带mongosh.exe文件,需要去官网下载MongoDB Shell
1.下载解压
2.将mongo shell的bin目录所在路径 写入到环境变量Path中
3.在已启动mongo服务的前提下,在mongo shell所在bin目录中,输入
mongosh
2.3 Compass图形化客户端连接数据库
1.下载安装
2.在已启动mongo服务的前提下,在应用程序中连接即可(注意端口号)
3. 基本常用信息
3.1 数据库操作
在 MongoDB 中,集合只有在内容插入后才会创建!
即创建集合(数据表)后要插入一个文档(记录)后集合才能被真正创建。
- 选择/创建数据库(如果数据库不存在则自动创建)
use <dbname>
- 查看所有的数据库
show dbs
show databases # 二选一
- 查看当前正在使用的数据库
db
# 若没有选择数据库,集合将默认存放在test数据库中
-
数据库名可以是满足以下条件的任意UTF-8字符串:
-
不能为空
-
不得含有空格、点、$、/、\和空字符
-
应全部小写。
-
最多64字节。
-
-
有部分数据库名被预留,具有特殊作用:
-
admin: 相当于root数据库。若一个用户可以添加这个数据库,这个用户则可自动继承所有数据库的权限。一些特殊服务器端命令也只能在这个数据库中运行(如列出所有的数据库或者关闭服务器)
-
local: 这个数据永远不会被复制,用来存储限于本地单台服务器的任意集合
-
config: 当Mongo进行分片设置时,config数据库在内部使用,用于保存分片的相关信息
-
-
删除数据库
db.dropDatabase()
# 主要用以删除 已经持久化的数据库
3.2集合操作
- 集合显式创建(直接创建,不推荐)
db.createCollection(<集合名称>)
- 集合的命名规范:
- 不能是空字符串
- 不能含有空字符
- 不能以"system."开头(为系统集合保留的前缀)
- 集合隐式创建(通过插入文档来创建,推荐)
- 集合删除
db.collection.drop(<集合名称>)
db.<集合名称>.drop() # 二选一
# 若成功删除选定集合,方法返回 true,否则返回 false。
3.3 文档基本CRUD
1.增
- 单个插入
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
db.user.insert(
{
"articleid":"1",
"content":"string",
"userid":"1",
"nickname":"cui",
"createdatetime":new Date(),
"likenum":NumberInt(10),
"state":null
}
)
-
提示:
- 数字默认为double类型;若要存整型,必须使用函数NumberInt(整型数字),否则取出来存在问题了
- 插入当前日期使用 new Date()
- 插入的数据没有指定 _id ,会自动生成主键值
- 如果某字段没值,可以赋值为null,或不写该字段。
-
注意:
- 文档中的键值对是有序的
- MongoDB的文档不能有重复的键
- 文档的键是字符串
-
文档键命名规范:
- 键不能含有空字符(用以表示键的结尾)
- . 和 $ 有特别的意义,只有特定环境下才能使用。
- 以下划线"_"开头的键是被保留的(但并非严格要求的)。
-
批量插入
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
# 插入时若指定了 _id ,则主键就是该值。
# 若某条数据插入失败,将会终止插入(但已经插入成功的数据不会回滚掉)
2.删
db.<集合名称>.remove(<条件>)
db.user.remove({}) # 会将数据全部删除,慎用!
db.user.remove({_id:"1"} # 删除_id=1的记录
3.改
db.collection.update(query, update, options)
db.collection.update(
<query>, # 更新条件
<update>, # 更新文档
{
upsert: <boolean>, # 为true时,没有符合的时自动添加新文档
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
# 关注前四个参数即可
# 覆盖修改
db.user.update({_id:"1"},{likenum:NumberInt(1001)})
# 局部修改
db.user.update({_id:"2"},{$set:{likenum:NumberInt(889)}})
# 批量修改
# 默认只修改第一条数据
db.user.update({userid:"1"},{$set:{nickname:"hua"}})
# 修改所有符合条件的数据
db.user.update({userid:"1"},{$set:{nickname:"nick"}},{multi:true})
# 列值增长修改(如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符来实现)
# 实现效果:点赞数每次递增1
db.user.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})
4.查
- 单个查询
db.collection.find(<query>, [projection])
db.user.find({"userid":"1"})
db.user.findOne({userid:'1003'}) # 只要一个符合要求的文档
# 投影查询(不显示所有字段,只显示指定的字段):
db.user.find({userid:"1"},{userid:1,nickname:1})
# 只显示userid、nickname、_id,因为默认会显示_id
db.user.find({userid:"1"},{userid:1,nickname:1,_id:0}) # 不会显示了
- 查询所有
db.user.find()
db.user.find({}) # 二选一
3.4 文档的分页查询
- 查询统计
db.collection.count(query, options)
db.user.count() # 统计所有记录数
db.user.count({userid:"1"}) # 按条件统计记录数
- 分页查询
db.user.find().limit(3).skip(1)
# limit()方法用于读取指定数量的数据
# skip()方法用于跳过指定数量的数据
- 排序查询
db.user.find().sort({KEY:1})
db.user.find().sort(1) # 二选一
# sort() 方法可以通过参数指定排序的字段
# 其中 1 为升序排列,而 -1 是用于降序排列。
- 执行的顺序:先 sort(), 然后是 skip(),最后是显示的 limit()
- 和命令编写顺序无关。
3.5 更多查询
- 正则查询
db.collection.find({field:/正则表达式/})
db.user.find({content:/开水/}) # 查询评论内容包含“开水”的所有文档
- 比较查询
db.集合名称.find({ "field" : { $gt: value }}) # 大于
db.集合名称.find({ "field" : { $lt: value }}) # 小于
db.集合名称.find({ "field" : { $gte: value }}) # 大于等于
db.集合名称.find({ "field" : { $lte: value }}) # 小于等于
db.集合名称.find({ "field" : { $ne: value }}) # 不等于
- 包含查询
db.user.find({userid:{$in:["3","4"]}})
db.user.find({userid:{$nin:["3","4"]}})
- 条件连接查询
db.user.find({$and:[{条件1},{条件2}]})
db.user.find({$or:[{条件1},{条件2}]})