①MongoDB基本知识①

news2024/9/20 0:30:43

  MongDB属于非关系型数据库一派,没有固定的数据格式存储,是一个具备高性能、高拓展的文档型数据库,数据以BSON(JSON的二进制)的格式存储。

特点:

  1. 基于对象模型,关系简单。没有外键的约束,也没有强连接表的关系,适用于对需求不确定的系统开发。
  2. 反范式、无关联的组织结构极大的加快了查询的速度。
  3. 同一个集合中对象包含的字段可以不同,能根据需求快速响应,属于半结构化数据,对开发十分友好便捷。
  4. MongoDB支持高可用,实现一主多从,主节点宕机了,从节点会经过筛选承担主节点的位置。
  5. MongoDB支持可拓展,对于数据可进行分片处理,对于应用透明。
  6. 提供JS形式的API方法,操作简便

一、MongoDB基本概念(同关系型数据库对比)

1.专有名词

关系型数据库MongoDB
字段(field)字段(field)
行(row)文档(document)
表(table)集合(collection)
数据库(database)数据库(database)
主键(自定义 primary key)主键(_id,自动生成 )
索引(index)索引(index)
表连接(left join)聚合操作(管道))

2.JSON vs BSON

JSONBSON
存在形式基于文本形式基于二进制编/解码
遍历速度较慢
数据类型6种丰富

  JSON支持的六种基础类型:

	string: 字符串 
	number : 数值 
	object: JS的对象形式,用{key:value}表示 
	可嵌套 array: 数组,JS的表示方式[value] 
	布尔类型  true/false: 
	null: 空值
2.1 BSON数据格式


官方地址
   可以利用BSON的数据格式type进行查询匹配,例如:db.collection.find({“title” : {$type : “string”}})
部分数据类型讲解

2.1.1 时间类型
	db.collection.insert([{data1:Date()},{data2:new Date()},{data3:ISODate()}])
	ISODate() = new Date(),得到的是UTC的时间,Date()得到的是本地时间
2.1.2 ObjectId生成器

  所有的文档都有一个_id字段,且是唯一的,相当于主键。_id字段的值采用16进制编码形式,共12个字节。是通过ObjectId生成器生成的,且具有一定的规则来保证唯一。
  ObjectId被定义为3个部分: 4字节表示Unix时间戳(秒)。 5字节表示随机数(机器号+进程号唯一)。 3字节表示计数器(初始化时随机)。

二、MongoDB命令基本使用

1、用户操作
用户操作

2、集合操作
集合操作

3、文档操作

在这里插入图片描述

三、固定集合(capped collection)

  固定集合,从字面意思就可以知道,长度是固定的,适用于短时间使用的数据存储。遵循先进先出的原则,所以当空间已满时,会将最先进的文档,进行取代。
在这里插入图片描述

db.createCollection("logs",{capped:true,size:4096,max:10})
capped: true 指定为固定集合,size指定固定集合存储空间的大小

优势:

  1. 遵循先进先出原则,底层根据顺序IO操作,读写性能高

缺点:
2. 无法动态修改存储的上限
3. 无法删除已有的数据

四、WiredTiger(读写模型存储引擎)

  引入WiredTiger,对于MongoDB就是如虎添翼,加快了读写的效率,也进一步保障数据的不丢失。

  读取依赖于WiredTiger的内存缓存,主要原理如下:

在这里插入图片描述

  1. 数据库发起读IO操作,操作系统将磁盘数据经过调度加载在页面缓存区中。
  2. 存储引擎读取页面的数据,通过加压缩的方式存储在内存缓存区中。
  3. 在存储引擎内存中进行匹配,匹配成功后返回结果。

 写操作(减少磁盘IO,提高速率): 当数据发生写入时,MongoDB并不会立即持久化到磁盘上,而是先在内存中记录这些变更,之后通过CheckPoint机制将变化的数据写入磁盘。

主要基于两部分保障数据的不丢失

  1. 基于快照(CheckPoint): 每60秒一次进行保存
  2. 基于日志(Journal): 保存所有的写操作,以便快照失效能保存数据

另外MongoDB为了尽可能保证业务查询的“热数据”能快速被访问,其内部缓存的默认大小达到了内存的一半

五、 mongoDB索引讲解

   索引的建立是为了更快速的获取到查询的结果,MongoDB的索引数据结构选取的是B+tree。

索引的分类有如下几种情况:

  1. 按照索引的字段数量进行分类: 单键索引、组合索引(复合索引)
  2. 按照索引的字段是否为主键进行分类: 主键索引、非主键索引
  3. 按照索引节点中物理记录来区分,聚簇索引(包含指针和数据)、非聚簇索引(只有指针)
  4. 索引特性: 唯一索引、地理位置索引、ttl索引、文本索引、稀释索引等。

1.索引操作命令

   索引创建操作命令的options参数有
在这里插入图片描述

1.1 普通索引
	db.collection.createIndex(keys, options) 创建索引命令
	其中key,指定1为升序,指定-1为降序
	# 创建索引后台执行
	db.collection.createIndex({open: 1, close: 1}, {background: true})
	#创建唯一索引,在options位置上添加unique:true即可
	db.collection.createIndex({_id: 1},{unique: true})
	//查看当前集合的所有索引
	db.collection.getIndexes()
	//查看当前集合的所有索引健
	db.collection.getIndexKeys()
	//查看索引所占空间
	db.collection.totalIndexSize([is_detail])
	//删除索引
	db.collection.dropIndex('索引名称')
	//删除集合下所有索引
	db.collection.dropIndexes();
1.2 复合索引
	创建复合索引(索引包含多个字段值)
	db.collection.createIndex({type:1,favCount:1})
1.3 多键索引(与复合索引不同)
	例如 ratings: [1,2,3]是一个数组,包含了多个值,在此基础上建立索引称为多键索引
	db.collection.createIndex({rating:1})
	在范围上 多键索引<= 复合索引
1.4 地理位置索引
// 创建一个2dsphere索引
db.collection.createIndex({location : "2dsphere"})
// 查询附近10000米商家信息
db.restaurant.find( { 
    location:{ 
        $near :{
            $geometry :{ 
                type : "Point" ,
                coordinates : [  -73.88, 40.78 ] 
            } ,
            $maxDistance:10000 
        } 
    } 
} )

参数说明
  $near查询操作符,用于实现附近商家的检索,返回数据结果会按距离排序。$geometry操作符用于指定一个GeoJSON格式的地理空间对象,type=Point表示地理坐标点,coordinates则是用户当前所在的经纬度位置;$maxDistance限定了最大距离,单位是米。

1.5 全文索引

  全文索引能实现简易的分词检索,选定索引字段后,赋值为text即为全文索引。

#创建全文索引
db.collection.createIndex( { comment: "text" } )
// 通过$text操作符来查寻数据中所有包含“coffee”,”shop”,“java”列表中任何词语的商店
db.colletion.find({$text: {$search: "java coffee shop"}})
1.6 Hash索引

  哈希索引使用哈希来创建索引,能实现精确匹配,但不支持范围索引和多键Hash。

db.collection.createIndex({name: "hashed"})
1.7通配符索引

  对于索引建立的字段不确定时,可以使用通配符进行索引,用$**的方式进行匹配。

db.collection.insert([
    {
      "product_name" : "Spy Coat",
      "product_attributes" : {
        "material" : [ "Tweed", "Wool", "Leather" ],
        "size" : {
          "length" : 72,
          "units" : "inches"
        }
      }
    },
    {
      "product_name" : "Spy Pen",
      "product_attributes" : {
         "colors" : [ "Blue", "Black" ],
         "secret_feature" : {
           "name" : "laser",
           "power" : "1000",
           "units" : "watts",
         }
      }
    },
    {
      "product_name" : "Spy Book"
    }
])
# 创建通配符索引
db.collection.createIndex( { "product_attributes.$**" : 1 } )
# 通配符索引的使用
db.collection.find( { "product_attributes.size.length" : { $gt : 60 } } )
db.collection.find( { "product_attributes.material" : "Leather" } )
db.collection.find( { "product_attributes.secret_feature.name" : "laser" 

特性:
  1.通配符索引不适用于其他特性的索引
  2.通配符索引不能用于查询不存在字段的文档
  3.通配符索引不能支持精确的对象或数据精准匹配

1.8 唯一索引

  创建索引时提高unique:true的配置即可

db.collection.createIndex({title:1,type:1},{unique: true})
1.9 部分索引

  部分索引也可以叫过滤索引,就是将索引进行条件过滤,符合条件的索引可以进行部分索引。

# 创建过滤索引
db.collection.createIndex(
  { cuisine: 1, name: 1 }, # 索引字段
  { partialFilterExpression: { rating: { $gt: 5 } } } 
)
#使用过滤索引
#符合条件,使用索引
db.collection.find( { cuisine: "Italian", rating: { $gte: 8 } } )
#不符合条件,不能使用索引
db.collection.find( { cuisine: "Italian" } )

  如果同时指定了partialFilterExpression和唯一约束,那么唯一约束只适用于满足筛选器表达式的文档

1.10 稀释索引

  稀疏索引对存在索引字段的文档进行索引,不存在该字段的会过滤(对存在字段的文档进行索引(包括字段值为null的文档))。

#创建稀释索引(在选项位置添加sparse: true即可)
db.collection.createIndex( { "name": 1 }, { sparse: true } )
#可以和唯一索引一起使用
db.collection.createIndex({"name": 1},{sparse: true,unique:true})
#二者结合可以防止集合中存在字段值重复的文档,
#但允许不包含此索引字段的文档插入(满足稀释条件的唯一,不满足不唯一)。
1.11 TTL索引

  对于随着时间推移,不再使用的数据要进行清理,以降低内存的消耗。我们要对这些数据进行老化处理,就需要给数据指定一个清理时间,常规解决方法有两个,一个是为每个数据指定一个时间戳定时清理,一个是将数据进行存表分类,之后对该表进行定时清理。而MongoDB提供给TTL索引,我们只需要声明在一个日期类型的字段中,TTL 索引是特殊的单字段索引。

# TTL索引标识(expireAfterSeconds: 3600 ) 指定expireAfterSeconds
db.collection.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )

#可以进行更改过期时间
db.runCommand({collMod:"集合名称",index:{keyPattern:{createdAt:1},expireAfterSeconds:600}})
1.12 隐藏索引

  隐藏索引的好处就是对部分带有负面影响的索引进行隐藏

#创建隐藏索引
db.collection.createIndex({ borough: 1 },{ hidden: true });
# 现有隐藏索引
db.collection.hideIndex( { borough: 1} );
#取消隐藏索引
db.scores.unhideIndex( { userid: 1} )

2.索引执行情况

  在查询的过程中,我们需要去清理我们是否使用了索引以及索引起到了什么样的效果,这个时候我们就需要通过explain()去获取数据扫描的情况。

verbose参数如下:
在这里插入图片描述

db.collection.find().explain(<verbose>)

stage的状态可以判断出是否使用了索引进行扫描
在这里插入图片描述

使用的时候尽量不要出现以下的stage:

  1. COLLSCAN(全表扫描)
  2. SORT(使用sort但是无index)
  3. 不合理的SKIP
  4. SUBPLA(未用到index的$or)
  5. COUNTSCAN(不使用index进行count)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2125221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程&#xff1a;learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…

信息安全管理工程师

信息安全管理工程师是专门从事信息安全领域的专业人员&#xff0c;主要负责维护计算机系统、网络和数据的安全&#xff0c;以抵御潜在威胁和攻击。 随着信息技术迅猛发展&#xff0c;对此类专业人才的需求持续上升。 如何能够成为一名卓越的信息安全管理工程师呢&#xff1f;…

springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件

首先&#xff0c;对数据库进行备份&#xff0c;用到的命令&#xff1a; mysqldump --opt -h 192.168.1.200 --userroot --passwordxxx --result-fileE://data//20240911141400.sql --default-character-setutf8 xxx&#xff08;数据库名&#xff09; 直接上代码 配置文件部分…

Android 语言国际化三步

1.罗列: 可以多罗列几个 不需要全部实现 res下创建这个文件:locale-config <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" /> <!--中文 --><locale android:name"e…

优化 TCP 以提高网络性能

本页面简要介绍了计算正确设置的方法&#xff0c;以缩短 Google Cloud 和混合场景中 TCP 连接的延迟时间。本页面还可帮助您了解如何缩短 Google Cloud 中流程之间的连接延迟时间。 现代微服务架构主张&#xff0c;开发者应该构建处理单一任务的小型服务。服务应根据系统的可靠…

Open CASCADE学习|通过指定点的曲线

在OpenCASCADE中&#xff0c;如果你想通过一系列指定的点来创建一条曲线&#xff0c;你可以使用Geom2dAPI_Interpolate类来实现二维曲线的插值&#xff0c;或者使用GeomAPI_Interpolate类来实现三维曲线的插值。这些类允许你定义一条B样条曲线&#xff0c;这条曲线将精确地通过…

内网安全:反弹shell

目录 一.Netcat反弹Shell 二.PowerCat反弹Shell PowerCat和nc正向连接 PowerCat和nc反向连接 PowerCat和PowerCat反向连接 三.Bash反弹shell 四.Python 反弹Shell 一.Netcat反弹Shell 在Windows容易被杀 介绍&#xff1a; Netcat简称NC,是一个简单、可靠的网络工具,被…

0V企业级别通配符证书

OV企业级别通配符证书&#xff0c;支持顶级域名下面的所有二级子域名&#xff0c;不限制二级子域名个数&#xff0c;证书显示单位实名名称。 加密算法支持2048bits&#xff1b;签名算法支持SHA256withRSA。 可提供各种服务器的证书文件安装格式。 加密支持协议&#xff1a;T…

微信如何转发群消息给其他群或其他好友?

使用微加机器人将群消息转发到其他群或好友 工具选择&#xff1a; 近期想做一个从某个微信群将消息自动转发到另一个微信群的效果&#xff08;一些课程群和线报群只有付费才能进&#xff09; 试了市面上很多免费的转发软件&#xff0c;发现免费还是很难有好东西&#xff0c;…

Nature Communications 可远程操控食欲的口服软体机器人

肥胖对人群的的影响是深远的&#xff0c;它不仅关系到个人的健康&#xff0c;还与全球公共卫生挑战密切相关。据世界卫生组织的数据&#xff0c;全球每8人中就有1人患有肥胖症。肥胖增加了患2型糖尿病、心血管疾病、某些癌症等多种健康问题的风险&#xff0c;并对社会经济产生重…

公开课 | 金九银十,测试开发面试秘籍大公开!

随着金九银十的求职旺季悄然来临&#xff0c;你是否已经摩拳擦掌&#xff0c;准备在职场上大展拳脚了呢&#xff1f;但面对激烈的竞争和复杂的面试环节&#xff0c;你是否也曾感到过迷茫和不安&#xff1f;别担心&#xff0c;我们懂你&#xff01; 本周四&#xff0c;我们特别…

Oracle与AWS和解! Oracle市场破历史新高 4350亿美金

数据库去o风风火火&#xff0c;然而似乎对甲骨文来讲并没有丝毫影响。很多人曾经都在嘲笑Oracle在云上发力的太晚太晚&#xff0c;错过了公有云的历史发展机遇。 今天看到群里有人分享一个消息说甲骨文老板想通了&#xff0c;跟三大云厂商合作了&#xff0c;看来是真的。 我们…

通过XMLHttpRequest和window.open在浏览器中打开文件流pdf以及下载pdf

1、浏览器预览pdf&#xff1a; 首先通过接口获取文件流数据 下发是源码 var xhr new XMLHttpRequest(); xhr.open("GET", http://www.baidut.com/downloadFile); xhr.responseType "blob"; xhr.onload function(){ if(this.status 200){ var blob…

全视通医院智慧后勤全场景管理+一体化解决方案,让医院管理提质增效

在 “十四五” 时期&#xff0c;公立智慧医院建设正如火如荼地进行着。2021年&#xff0c;国家卫生健康委医政医管局发布《医院智慧管理分级评估标准体系&#xff08;试行&#xff09;》&#xff0c;从政策层面给出了推进面向医务人员的“智慧医疗”、面向患者的“智慧服务”、…

Cadenza 项目:机器学习如何改善听力受损人士的音乐聆听体验

音乐&#xff0c;作为全人类共享的文化瑰宝&#xff0c;具有强大的凝聚力&#xff0c;它不仅塑造了我们的社会风貌&#xff0c;更为我们的身心健康带来诸多益处。然而&#xff0c;听力损失却无情地削弱了这份美妙的体验。据世界卫生组织预测&#xff0c;到2050年&#xff0c;全…

大模型技术场景与商业应用(2024):赋能千行百业产业链升级

大模型技术场景与商业应用&#xff08;2024&#xff09;&#xff1a;赋能千行百业产业链升级 引言 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已成为推动各行业数字化转型的关键驱动力。从2023年的ChatGPT大模型爆火至…

低代码平台与统一待办:提升工作效率的新趋势

什么是低代码平台&#xff1f; 低代码平台是一种允许用户通过图形化界面和简单的拖放操作创建应用程序的开发工具。它极大地简化了应用程序的开发过程&#xff0c;使得非技术背景的用户也能够参与到应用开发中来。低代码平台通常包括预建的组件、模板和集成功能&#xff0c;大…

【论文阅读】视觉分割新SOTA: Segment Anything(SAM)

导言 随着基于对比文本—图像对的预训练&#xff08;CLIP&#xff09;方法或者模型、聊天生成预训练转换器&#xff08;ChatGPT&#xff09;、生成预训练转换器-4&#xff08;GPT-4&#xff09;等基础大模型的出现&#xff0c;通用人工智能&#xff08; AGI&#xff09;的研究…

web项目如何部署到服务器上呢?——麻烦的方法

只需关注web项目如何部署到服务器上&#xff0c;因为服务器运行时就可以访问web项目了。 一、麻烦的方法 1、首先启动服务器 &#xff08;1&#xff09;找到bin文件夹 &#xff08;2&#xff09;双击运行startup.bat文件 &#xff08;3&#xff09;运行之后的界面如下&#…

MongoDB日志级别

日志 查看当前的日志级别 根据你提供的 MongoDB 命令结果&#xff0c;命令 db.adminCommand({ getParameter: "logComponentVerbosity" }) 返回了 "ok" : 0&#xff0c;这意味着命令执行失败&#xff0c;没有成功获取到日志级别的配置信息。错误信息 &quo…