数据库应用:MongoDB 文档与索引管理

目录

一、理论

1.MongoDB文档管理

2.MongoDB索引管理

二、实验

1.MongoDB文档管理

2.MongoDB索引管理(索引添加与删除)

3.MongoDB索引管理(全文索引)

4.MongoDB索引管理(多列索引)

5.MongoDB索引管理(ttl索引)

三、问题

1.查询执行情况报错

2.创建索引失败

3.find查询报错


一、理论

1.MongoDB文档管理

(1)数据类型

表1 数据类型

Type描述
ObjectID用于存储文档的ID,相当于主键,区分文档的唯一字段,mongoDB中就是一个对象的返回值
String字符串是最常用的数据类型,MongoDB中的字符串必须是UTF-8编码。
Integer整数类型用于存储数值。整数可以是32位,也可以是64位,这取决于你的服务器。
Double双精度类型用于存储浮点值,mongodb中没有float浮点数这个说法
Boolean布尔类型用于存储布尔值(true/ false)
Arrays将数组、列表或多个值存储到一个键,[]
Timestamp时间戳,用于记录文档何时被修改或创建。Date(),Timestamp(),ISODate()
Object用于嵌入文档, 相当于子属性是另一个json文档而已,这种方式就可以实现嵌套。 []
Null空值,相当于 python的None
Symbol与字符串用法相同,常用于某些使用特殊符号的语言,二进制
Date用于以UNIX时间格式存储当前日期或时间。
Binary data二进制数据,常用于保存文件的内容,往往是图片,数据本身。
Code用于将JavaScript代码存储到文档中
Regular expression正则表达式

(2)条件运算符(查询器)

①比较运算

表2 比较运算

操作格式语法例子SQL中的类似语句
等于{<key>:<val>} {<key>:{$eq:<val>}}db.集合.find({"name":"xiaoming"})where name = 'xiaoming'
小于{<key>:{$lt:<val>}}db.集合.find({"age":{$lt:17}})where age  < 17
小于或等于{<key>:{$lte:<val>}}db.集合.find({"age":{$lte:17}})where age  <= 17
大于{<key>:{$gt:<val>}}db.集合.find({"age":{$gt:17}})where age > 17
大于或等于{<key>:{$gte:<val>}}db.集合.find({"age":{$gte:17}})where age >= 17
不等于{<key>:{$ne:<val>}}db.集合.find({"age":{$ne:17}})where age != 17
包含{<key>:{$in:[<val>...]}}db.集合.find({"age":{$in:[1,2,3]}})where age in (1,2,3)

②逻辑运算

表3 逻辑运算

操作语法语法例子
$and{<key>:<val>,<key>:<val>,...} {$and: [{key:{$运算符:<val>}},....]}db.集合.find({key1:value1, key2:value2})
$or{$or: [{<key>: {$运算符:<val>}}, ....]}db.集合.find({$or: [{key1: value1}, {key2:value2}]})
$and$or`{<key>:<val>, $or: [{<key>: {<$运算符>:<val>}},...]}`<br>`{$and:[{$or:[{<key>:{<$运算符>:<val>}},..]},$or:[{<key>:{<$运算符>:<val>}},..]}]}`db.集合.find({key1:value1, $or: [{key1: value1}, {key2:value2}]})
$not{<key>:{$not:{<$运算符>:<val>}}}`$not`操作符不支持``$regex`正则表达式操作

③其他运算符

表4 其他运算符

操作格式法例子说明
$type{<key>:{$type: <datetype>}}db.集合.find({"name":{$type:'string'}})匹配指定键是指定数据类型的文档 number 数值型 string 字符串 bool 布尔类型 object json文档对象类型 array 数组类型
$exists{<key>:{$exists:<bool>}db.集合.find({"title":{$exists:true}})匹配具有指定键的文档,存在指定字段的文档
$regex`{ <key>:/模式/<修正符>}`<br>`{<key>:{$regex:/模式/<修正符>}}`db.集合.find({"name":{$regex:/张$/}})按正则匹配
$mod{<key>: {$mod: [除数, 余数]}}db.集合.find({"age":{$mod:[10,0]}})算数运算,取模,语法中举例是age除以10==0

(3) update更新运算符(修改器)

表5  update更新运算符

操作语法说明
$incdb.集合.update({<key1>:<val1>},{$inc:{<key2>:<val2>}})更新key1=val1的文档中key2的值为val2,类似python的递增递减<br>递减,则`{ $inc:{<key2>:-<val2>} }`
$setdb.集合.update({<key1>:<val>}, {$set:{<key2>:<val2>}})更新key1=val1的文档中key2的值为val2,如果key2不存在则新增对应键值对
$unsetdb.集合.update({<key1>:<val>}, {$unset:{<key2>:<val2>}})移除key1=val1的文档中key2=val2这个键值对
$pushdb.集合.update({<key1>:<val>}, {$push:{<key2>:<val2>}})给key1=val1的文档中key2列表增加1个数组成员val2。<br>key2必须是数组。
$pulldb.集合.update({<key1>:<val>}, {$pull:{<key2>:<val2>}})与push相反,给key1=val1的文档中key2列表删除1个指定成员val2
$popdb.集合.update({<key1>:<val>}, {$pop:{<key2>:<val2>}})给key1=val1的文档中key2列表移除第一个或最后一个成员。 val2只能是1(最后面)或-1(最前面),与python相反

2.MongoDB索引管理

(1)stage的扫描类型

表6 stage的扫描类型

类型名称描述期望
COLLSCAN全表扫描False
IXSCAN索引扫描True
FETCH根据索引去检索指定documentTrue
IDHACK针对_id进行查询True
COUNTSCANcount不使用Index进行count时返回False
COUNT_SCANcount使用了Index进行count时返回True
SUBPLA未使用到索引的$or查询时返回False
TEXT使用全文索引进行查询时返回-
SORT使用sort排序但是无index时返回False
SKIP使用skip跳过但是无index时返回False
PROJECTION使用limit限定结果但是无index时返回False

(2)注意事项

1) MongoDB的索引是存储在运行内存(RAM)中的,所以必须确保索引的大小不超过内存的限制。如果索引的大小超过了运行内存的限制,MongoDB会删除一些索引,这将导致性能下降。2) MongoDB的索引在部分查询条件下是不会生效的。-   正则表达式及非操作符,如 `$nin`,`$not` , 等。-   算术运算符,如 $mod, 等。-   $where自定义查询函数。-   ...3)索引会在写入数据(添加、更新和删除)时重排,如果项目如果是写多读少,则建议少使用或者不要使用索引。4) 一个集合中索引数量不能超过64个。5) 索引名的长度不能超过128个字符。6) 一个复合索引最多可以有31个字段。7) mongodb索引统一在`system.indexes`集合中管理。这个集合只能通过`createIndex`和`dropIndexes`来操作。

二、实验

1.MongoDB文档管理

(1)排序

(2)regex 正则匹配

(3)取年龄

(4)前5个和第6个开始

db.user_list.find({},{"_id":0,"name":1,"age":1}).sort({"age":1}).limit(5);

(5)查询所有数据

(6)laoli 减去2岁

db.user_list.updateMany({name:"laoli"},{$inc:{age:-2}})

(7)xiaoming都改为20岁

 db.user_list.updateMany({name:"xiaoming"},{$set:{age:20}})

(8)xiaoming都增加2岁

> db.user_list.updateMany({name:"xiaoming"},{$inc:{age:2}})

(9)删除所有有手机号的

db.user_list.updateMany({name:"xiaoming",mobile:{exists:true}},{$unset:{mobile:true}})

(10)往列表属性中追加成员

db.user_list.update({"name":"laoli"},{$push:{"lve":"code"}}); 

(11)删除列表成员

db.user_list.update({"name":"laoli"},{$pull:{"lve":"TV"}});

(12)$addToSet 结合 $each 把一个数组中每一个成员添加到数组中

db.user_list.update({"name":"laoli"},{$addToSet:{"lve":{$each:["run","swim","ball"]}}});

(13)左边移除列表的第一个成员

 db.user_list.update({"name":"laoli"},{$pop:{"lve":-1}}); 

(14)右边移除列表的最后一个成员

db.user_list.update({"name":"laoli"},{$pop:{"lve":1}});

(15)$rename 字段名重命名

db.user_list.update({"name":"laoli"},{$rename:{"lve":"love"}});

2.MongoDB索引管理(索引添加与删除)

(1)获取当前集合中已经创建的索引总大小,以字节为单位返回结果

(2)获取当前数据库中所有的索引(不会显示_id主键)

(3)查询MongoDB

(4)查询1条数据,准备用user_id做 索引

(5)新增索引(6)查看是否走索引

> db.orders.find({user_id:10}).count()
200
> db.orders.find({user_id:101}).count()
200
> db.orders.find({user_id:101}).explain("executionStats");

(7)倒叙查询,显示先查询(104M数据)再索引

(8)索引迭代2个版本

(9)3微秒执行402次

(10)执行完成

(11)准备选取2个做索引

(12)创建索引

(13)查看索引数量(第一个为默认的主键索引,第二个为单字段普通索引,第三个为多字段索引)

(14)走了索引

db.orders.find({"date":"2020-09-01"}).explain("executionStats");

(15)还是走了索引(只要有1个满足就会走索引)

db.orders.find({"date":"2020-09-01","onumber":"0000000000001007"}).explain("executionStats");

(16)没条件满足会走全表扫描

db.orders.find({"title":"购买商品-1007","onumber":"0000000000001007"}).explain("executionStats");

(17)删除单字段索引

(18)删除多字段索引

> db.orders.dropIndex("user_id_1")
{ "nIndexesWas" : 3, "ok" : 1 }
> db.orders.getIndexes()

(19)全表扫描

> db.orders.find({"date":"2020-04-17","title":"赠送礼品-10"});> db.orders.find({"date":"2020-09-01","title":"赠送礼品-10"}).explain("executionStats");

(20)添加多字段索引,查询为索引扫描

> db.orders.createIndex({"date":1,"user_id":1});> db.orders.find({"date":"2020-09-01","title":"赠送礼品-10"}).explain("executionStats");

3.MongoDB索引管理(全文索引)

(1)默认支持英文

(2)查询基本使用,命中全文索引

db.orders.find({$text:{$search:"商品-19"}}).explain("executionStats")

(3)还有倒序步骤

4.MongoDB索引管理(多列索引)

(1)创建测试数据

(2)添加唯一索引

db.orders.createIndex({"onumber":1},{unique:true});

(3)查看索引

db.orders.getIndexes()

(4)获取索引大小(包含全文和唯一索引)

db.orders.totalIndexSize()

(5)索引扫描

db.orders.find({"onumber":"0000000000001019"}).explain("executionStats")

(6)创建doc表并查询索引

(7)删除后变成全表扫描

(7)删除orders表全文索引查看大小

(8)已命中

(9)删除索引

> db.orders.dropIndexes("onumber_1")> db.orders.getIndexes()

5.MongoDB索引管理(ttl索引)

(1)在文档创建10秒后删除文档

(2)插入显示已被删除

(3)删除索引

(4)新建索引

(5)都已删除

三、问题

1.查询执行情况报错

(1)问题

(2)语法错误

语法错误修改命令

(3)解决方法

修改命令

2.创建索引失败

(1)问题

(2)原因分析

语法错误

(3)解决方法

修改命令

3.find查询报错

(1)报错

(2)原因分析

语法错误

(3)解决方法

修改命令

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

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

相关文章

虚拟数字人有什么用?有哪些应用场景?

​​过去三年&#xff0c;元宇宙概念进入到大众视野&#xff0c;虚拟数字人备受关注。抖音达人柳夜熙、洛天依、网红虚拟偶像AYAYI等&#xff0c;随着元宇宙的流行&#xff0c;数字人也逐渐成为一种趋势。据行业预测&#xff0c;到2030年&#xff0c;中国的数字人总市场规模将达…

APITable免费开源的多维表格与可视化数据库本地部署公网远程访问

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

我与开源的历程

我在2000年开始接触开源&#xff0c;当时在松下航空电子美国总部工作。我负责将 IFE 系统从 Win31 迁移到 Linux。作为一个完全不懂 Linux 的小白&#xff0c;我不得不找到一台笔记本电脑安装并自学 Redhat Linux 6.1。2003年回到新加坡后&#xff0c;我发现没有一个凝聚 Linux…

最新AI创作系统ChatGPT系统运营源码+DALL-E3文生图+支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

centos7下执行yum命令报错

前言 在Linux系统中&#xff0c;安装nginx时候&#xff0c;需要先安装环境。 Nginx是使用C语言开发&#xff0c;安装nginx需要先从官网上将源码下载&#xff0c;然后编译&#xff0c;编译需要gcc环境,但是在安装gcc环境的时候&#xff0c;执行命令报错。 yum install –y gcc-…

Java零基础——Redis篇

1.【熟悉】NoSQL的简介 1.1 什么是NoSQL NoSQL 是 Not Only SQL 的缩写&#xff0c;意即"不仅仅是SQL"的意思&#xff0c;泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。 NoSQL产品是传统关系型数据库的功能阉割版本&#xff0c;通过减少用不到或…

易宝OA ExecuteSqlForSingle SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台&#xff0c;具有信息管理、 流程管理 、知识管理&#xff08;档案和业务管理&#xff09;、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForSingle接口处存在SQL注入漏洞&a…

qt 5.15.2压缩和解压缩功能

qt 5.15.2压缩和解压缩功能 主要是添加qt项目文件.pro内容&#xff1a; 这里要先下载quazip的c项目先编译后引入到本项目中/zip目录下 INCLUDEPATH ./zip CONFIG(debug, debug|release) {win32:win32-g: PRE_TARGETDEPS $$PWD/zip/libquazipd.awin32:win32-g: LIBS -L$$PWD…

基于Netty的网络调用实现

作为一个分布式消息队列&#xff0c;通信的质量至关重要。基于TCP协议和Socket实现一个高效、稳定的通信程序并不容易&#xff0c;有很多大大小小的“坑”等待着经验不足的开发者。RocketMQ选择不重复发明轮子&#xff0c;基于Netty库来实现底层的通信功能。 1 Netty介绍 Net…

【pytorch】深度学习入门一:pytorch的安装与配置(Windows版)

请支持原创&#xff0c;认准DannisTang&#xff08;tangweixuan1995foxmail.com&#xff09; 文章目录 第〇章 阅读前提示第一章 准备工作第一节 Python下载第二节 Python安装第三节 Python配置第四节 Pycharm下载第五节 Pycharm安装第六节 CUDA的安装 第二章 Anaconda安装与配…

Gitee 之初体验(上)

我们在项目开发或者自己学习的时候&#xff0c;总会存在这样的问题&#xff1a; 在一台电脑上编写完代码&#xff0c;想要再另外一台电脑上再去写&#xff0c;再或者和其他人一起协作等等场合&#xff0c;代码传来传去很麻烦。 这个时候&#xff0c;我们就可以去使用代码管理工…

LeetCode刷题---打家劫舍问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、打家劫舍 题目链接&#xff1a;打家劫舍 题目描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定…

Spring Security 6.x 系列(7)—— 源码分析之建造者模式

一、建造者模式 WebSecurity、HttpSecurity、AuthenticationManagerBuilder 都是框架中的构建者&#xff0c;把他们放到一起看看他们的共同特点&#xff1a; 查看AuthenticationManagerBuilder的继承结构图&#xff1a; 查看HttpSecurity的继承结构图&#xff1a; 查看WebSec…

数据结构(超详细讲解!!)第二十六节 图(上)

1.基本概念 图&#xff08;Graph&#xff09;是一种较线性表和树更为复杂的非线性结构。是对结点的前趋和后继个数不加限制的数据结构&#xff0c;用来描述元素之间“多对多”的关系(即结点之间的关系是任意的)。 一个图G &#xff08;V&#xff0c;E&#xff09;由顶点&…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式&#xff1a; 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式&#xff1a; IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

AI - Steering behaviorsII(碰撞避免,跟随)

Steering Behaviors系统中的碰撞避免&#xff0c;路径跟随&#xff0c;队长跟随 Collision Avoid 在物体前进的方向&#xff0c;延伸一定长度的向量进行检测。相当于物体对前方一定可使范围进行检测障碍物的碰撞 延伸的向量与碰撞物圆心的距离小于碰撞物的半径&#xff0c;则…

计算机体系结构----流水线技术(三)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----计算机系统结构教程(第二版)张晨曦等 计算机体系结构----流水线技术&#xff08;三&#xff09; 3.1 流水线的基本概念3.1.1 什么是流水线3.1.2 流水线的分类1. 部件级流水线、处理机级流…

C语言之结构体详解

C语言之结构体详解 文章目录 C语言之结构体详解1. 结构体类型的声明2. 结构体变量的创建和初始化3. 结构体的特殊声明4. 结构体的自引用结构体的自引用匿名结构体的自引用 5. 结构体内存对齐5.1 练习一5.2 练习三 6. 为什么存在内存对⻬? 1. 结构体类型的声明 struct tag {me…

05_属性描述符

05_属性描述符 文章目录 05_属性描述符一、属性描述符是什么&#xff1f;二、属性描述符①&#xff1a;查看属性描述②&#xff1a;设置属性描述符③&#xff1a;案例01.代码实现02.代码实现&#xff08;优化&#xff09; 一、属性描述符是什么&#xff1f; 属性描述符的结构 在…