我是靠谱客的博主 忧虑哑铃,最近开发中收集的这篇文章主要介绍NoSQL-文档模型NoSQL-文档模型MongoDB,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

NoSQL-文档模型

数据库排名:https://db-engines.com/en/ranking

实例应用场景数据模型优点缺点
k-v模型Radis;Memcached内容缓存,主要用于处理大数据的高访问负载key-value键值对
列式模型Hbase(Hadoop Database);BigTable(Google);Cassandra(Twitter)分布式文件系统以列存储,将同一列数据存储在一起
文档模型MongoDB;CouchDBWeb应用JSON格式的文档
图形模型Neo4j社交网络节点+边

MongoDB

MongoDB是介于关系型数据库和非关系型数据库之间的数据库。

MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。

关系型数据库含义MongoDB含义
database数据库database数据库
tablecollection集合
rowdocument文档
columnfield字段
index索引index索引
primary key主键primary keyMongoDB 会自动将 _id 字段设置为主键
view视图view视图
table joins表连接$lookup聚合管道来实现

应用场景

优势劣势
【快速】拥有适量级内存的Mongo性能是非常迅速的,它将热数据存储在物理内存中(而不仅仅是索引和少部分数据),使得热数据的读写变得十分迅速,从而提高了整体的速度和效率【无事务机制】Mongo本身没有自带的事务机制,如果想要实现事务,则需要通过额外的表从逻辑上实习事务
【高扩展性】Mongo的高可用性与集群架构拥有十分高的扩展性,通过物理机器的增加,以及sharding的增加,Mongo的扩展将达到一个十分惊人的地步【空间占用】磁盘空间占用比较大
【Failover机制】Mongo的副本集配置中,当主库遇到问题无法继续提供服务的时候,副本集将选举出一个新的主库继续提供服务
【存储方式】Mongo的json与bson存储格式十分适合文档格式的存储与查询
MongoDBMySQL
数据库模型非关系型关系型
存储方式虚拟内存+持久化不同的引擎有不同的存储方式
查询语句独特的查询方式传统sql语句
架构特点可以通过副本集,以及分片实现高可用常见有单点、M-S、MHA、MMM、Cluster等架构方式
数据处理方式基于内存,将热数据存在于物理内存中,从而达到高速读写不同的引擎拥有其不同的特点
MongoDBRedis
类型文档型数据库key-value存储
典型应用场景Web应用内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统
数据模型key-valuekey-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 如下表
创建索引参数类型描述
backgroundBoolean可选参数,当值为 true 时,表示在后台构建索引,避免在创建索引的过程阻塞其它数据库操作,默认值为 false
uniqueBoolean创建唯一索引,当值为 true 时表示创建唯一索引,以避免重复数据的插入,默认为 false
namestring索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称
dropDupsBoolean在建立唯一索引时是否删除重复记录,设置为 true 则表示创建唯一索引,默认值为 false,3.0 版本之后废弃
sparseBoolean对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为 true 的话,则在索引字段中不会查询出不包含对应字段的文档。默认值为 false
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL 设定,设定集合的生存时间
vindex version索引的版本号,默认的索引版本取决于 mongod 创建索引时运行的版本
weightsdocument索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重
default_languagestring对于文本索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则,默认为英语
language_overridestring对于文本索引,指定文档中包含要替代默认语言的语言的字段名称,默认值为 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论