概述
NoSQL-文档模型
数据库排名:https://db-engines.com/en/ranking
实例 | 应用场景 | 数据模型 | 优点 | 缺点 | |
---|---|---|---|---|---|
k-v模型 | Radis;Memcached | 内容缓存,主要用于处理大数据的高访问负载 | key-value键值对 | ||
列式模型 | Hbase(Hadoop Database);BigTable(Google);Cassandra(Twitter) | 分布式文件系统 | 以列存储,将同一列数据存储在一起 | ||
文档模型 | MongoDB;CouchDB | Web应用 | JSON格式的文档 | ||
图形模型 | Neo4j | 社交网络 | 节点+边 |
MongoDB
MongoDB是介于关系型数据库和非关系型数据库之间的数据库。
MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。
关系型数据库 | 含义 | MongoDB | 含义 |
---|---|---|---|
database | 数据库 | database | 数据库 |
table | 表 | collection | 集合 |
row | 行 | document | 文档 |
column | 列 | field | 字段 |
index | 索引 | index | 索引 |
primary key | 主键 | primary key | MongoDB 会自动将 _id 字段设置为主键 |
view | 视图 | view | 视图 |
table joins | 表连接 | $lookup | 聚合管道来实现 |
应用场景
优势 | 劣势 |
---|---|
【快速】拥有适量级内存的Mongo性能是非常迅速的,它将热数据存储在物理内存中(而不仅仅是索引和少部分数据),使得热数据的读写变得十分迅速,从而提高了整体的速度和效率 | 【无事务机制】Mongo本身没有自带的事务机制,如果想要实现事务,则需要通过额外的表从逻辑上实习事务 |
【高扩展性】Mongo的高可用性与集群架构拥有十分高的扩展性,通过物理机器的增加,以及sharding的增加,Mongo的扩展将达到一个十分惊人的地步 | 【空间占用】磁盘空间占用比较大 |
【Failover机制】Mongo的副本集配置中,当主库遇到问题无法继续提供服务的时候,副本集将选举出一个新的主库继续提供服务 | |
【存储方式】Mongo的json与bson存储格式十分适合文档格式的存储与查询 |
MongoDB | MySQL | |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | 不同的引擎有不同的存储方式 |
查询语句 | 独特的查询方式 | 传统sql语句 |
架构特点 | 可以通过副本集,以及分片实现高可用 | 常见有单点、M-S、MHA、MMM、Cluster等架构方式 |
数据处理方式 | 基于内存,将热数据存在于物理内存中,从而达到高速读写 | 不同的引擎拥有其不同的特点 |
MongoDB | Redis | |
---|---|---|
类型 | 文档型数据库 | key-value存储 |
典型应用场景 | Web应用 | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统 |
数据模型 | key-value | key-value |
优点 | 数据结构要求不严格,表结构可变,易于扩展 | 查找数据速度快 |
缺点 | 查询性能不高,缺乏统一的查询语法 | 数据没有结构化 |
● 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
● 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
● 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库,Mongo的路线图中已经包含对MapReduce引擎的内置支持。
● 用于对象及JSON数据的存储:Mongo的BSON 数据格式非常适合文档化格式的存储及查询。
当公司数据模型无法具体确定,后期明确要进行扩展时,且表与表之间不需要进行JOIN操作,可以使用mongodb数据库。
database数据库
-- 如果该数据库不存在则创建一个新的数据库;如果该数据库已经存在则切换到该数据库。
use database_name_xxx
-- 删除当前数据库
db.dropDatabase()
-- 显示所有数据库
show dbs
-- 查看当前选择的数据库
db
table集合
-- 创建集合
db.createCollection("COLLECTION_NAME")
db.createCollection("COLLECTION_NAME", options)
db.createCollection("COLLECTION_NAME",{capped: true, autoIndexId: true, size: 102400, max: 1000 })
# (可选)固定集合,当集合达到最大值时,会自动覆盖前期的文档,为true时,必须指定size参数
capped: boolean
# (可选)为固定集合指定一个最大值,单位为字节数,capped为true时,必须指定该参数
size:integer
# 自动在 _id 字段创建索引。默认为 false。
autoIndexId: boolean
# (可选)指定固定集合中包含文档的最大数。在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
max:integer
-- 删除指定集合
db.COLLECTION_NAME.drop()
-- 查看数据库中的所有集合
show collections
-- 创建索引
db.COLLECTION_NAME.createIndex({key:value}, options)
-- key 要创建索引的字段
-- value 1表示按升序创建索引,-1表示按降序来创建索引;
-- options 如下表
创建索引参数 | 类型 | 描述 |
---|---|---|
background | Boolean | 可选参数,当值为 true 时,表示在后台构建索引,避免在创建索引的过程阻塞其它数据库操作,默认值为 false |
unique | Boolean | 创建唯一索引,当值为 true 时表示创建唯一索引,以避免重复数据的插入,默认为 false |
name | string | 索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,设置为 true 则表示创建唯一索引,默认值为 false,3.0 版本之后废弃 |
sparse | Boolean | 对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为 true 的话,则在索引字段中不会查询出不包含对应字段的文档。默认值为 false |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL 设定,设定集合的生存时间 |
v | index version | 索引的版本号,默认的索引版本取决于 mongod 创建索引时运行的版本 |
weights | document | 索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重 |
default_language | string | 对于文本索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则,默认为英语 |
language_override | string | 对于文本索引,指定文档中包含要替代默认语言的语言的字段名称,默认值为 language |
document文档
JSON Document 文档数据库。数据格式是BJSON(Binary JSON)二进制JSON,以{key:value,…,key:value}存储在文档中。
-- 插入数据:若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,并提示主键重复,不保存当前数据。
db.COLLECTION_NAME.insert(document)
-- 插入数据:如果 _id 主键存在则更新数据,如果不存在就插入数据
db.COLLECTION_NAME.save(document)
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.replaceOne(document)
-- ObjectId 是一个 12 字节的 BSON 类型,具有以下结构:
-- 前 4 个字节表示时间戳;
-- 接下来的 3 个字节表示机器标识符;
-- 紧接着的 2 个字节由进程 id(PID)组成;
-- 最后 3 个字节是一个随机计数器的值。
-- 删除数据
db.COLLECTION_NAME.remove(
<query,>
{
justOne: <boolean>,
writeConcern: <document>
}
)
-- 更新集合中的文档
db.COLLECTION_NAME.update(
query,
update,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
-- upsert 当要更新的记录不存在时,是否当作新记录插入到集合中。true表示插入,false表示不插入。
-- multi 只更新找到的第一条记录(false),把按条件查出来的多条记录全部更新(true)
-- writeConcern 抛出异常的级别
-- 查看集合的文档
db.COLLECTION_NAME.find(<query,> <projection>)
-- query查询条件
{_id:ObjectId("61d5000efa5f8b0001bc42b3"),"字段1":"值1","字段2":"值2",}
-- projection查询字段
"显示字段":1
"不显示字段":0
-- 总条数
.count()
-- 指定查询条数
.limit(number)
-- 跳过的条数
.skip(number)
-- 字段排序。 1表示以升序,-1表示降序
-- sort操作是把数据拿到内存中再进行排序
.sort({"字段":1})
-- 格式化查询结果
.pretty()
-- 管道。在一个管道处理完毕后将结果传递给下一个管道处理,而且管道操作是可以重复的。
$project:用于从集合中选择要输出的字段;
$match:用于过滤数据,只输出符合条件的文档,可以减少作为下一阶段输入的文档数量;
$group:对集合中的文档进行分组,可用于统计结果;
$sort:将输入文档进行排序后输出;
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档;
$limit:用来限制 MongoDB 聚合管道返回的文档数量;
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
-- 聚合查询
db.COLLECTION_NAME.aggregate(aggregate_operation)
aggregate_operation聚合表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "author", last_url : { l a s t : " last : " last:"url"}}}]) |
操作 | 格式 | 范例 |
---|---|---|
= | {:} | db.COLLECTION_NAME.find({“by”:”Hello World”}).pretty() |
< | {:{$lt:}} | db.COLLECTION_NAME.find({“likes”:{$lt:50} }).pretty() |
<= | {:{$lte:}} | db.COLLECTION_NAME.find({“likes”:{$lte:50} }).pretty() |
> | {:{$gt:}} | db.COLLECTION_NAME.find({“createTime”:{$gt:ISODate(“2022-01-01T07:57:29.108Z”)}}).pretty() |
>= | {:{$gte:}} | db.COLLECTION_NAME.find({“likes”:{$gte:50} }).pretty() |
!= | {:{$ne:}} | db.COLLECTION_NAME.find({“likes”:{$ne:50} }).pretty() |
in | {:{$in:[, , …]}} | |
not in | {:{$nin:[, , …]}} | |
and | {$and:[{:}, …, {:}]} | db.COLLECTION_NAME.find({key1:value1, key2:value2}).pretty() |
or | {$or:[{:}, …, {:}]} | db.COLLECTION_NAME.find.find({“name”:33, “nickname”:{$ne:“Hello”} }).pretty() |
AND + OR | {:, $or:[{:}, …, {:}]} | db.COLLECTION_NAME.find.find({$or:[{“nickname”:“Hello”}, {“name”:1}]}).pretty() |
最后
以上就是忧虑哑铃为你收集整理的NoSQL-文档模型NoSQL-文档模型MongoDB的全部内容,希望文章能够帮你解决NoSQL-文档模型NoSQL-文档模型MongoDB所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复