数据库应用: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更新运算符
操作 | 语法 | 说明 |
$inc | db.集合.update({<key1>:<val1>},{$inc:{<key2>:<val2>}}) | 更新key1=val1的文档中key2的值为val2,类似python的递增递减<br>递减,则`{ $inc:{<key2>:-<val2>} }` |
$set | db.集合.update({<key1>:<val>}, {$set:{<key2>:<val2>}}) | 更新key1=val1的文档中key2的值为val2,如果key2不存在则新增对应键值对 |
$unset | db.集合.update({<key1>:<val>}, {$unset:{<key2>:<val2>}}) | 移除key1=val1的文档中key2=val2这个键值对 |
$push | db.集合.update({<key1>:<val>}, {$push:{<key2>:<val2>}}) | 给key1=val1的文档中key2列表增加1个数组成员val2。<br>key2必须是数组。 |
$pull | db.集合.update({<key1>:<val>}, {$pull:{<key2>:<val2>}}) | 与push相反,给key1=val1的文档中key2列表删除1个指定成员val2 |
$pop | db.集合.update({<key1>:<val>}, {$pop:{<key2>:<val2>}}) | 给key1=val1的文档中key2列表移除第一个或最后一个成员。 val2只能是1(最后面)或-1(最前面),与python相反 |
2.MongoDB索引管理
(1)stage的扫描类型
表6 stage的扫描类型
类型名称 | 描述 | 期望 |
COLLSCAN | 全表扫描 | False |
IXSCAN | 索引扫描 | True |
FETCH | 根据索引去检索指定document | True |
IDHACK | 针对_id进行查询 | True |
COUNTSCAN | count不使用Index进行count时返回 | False |
COUNT_SCAN | count使用了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)解决方法
修改命令
相关文章:

数据库应用:MongoDB 文档与索引管理
目录 一、理论 1.MongoDB文档管理 2.MongoDB索引管理 二、实验 1.MongoDB文档管理 2.MongoDB索引管理(索引添加与删除) 3.MongoDB索引管理(全文索引) 4.MongoDB索引管理(多列索引) 5.MongoDB索引管…...

Python批处理PDF文件,PDF附件轻松批量提取
PDF附件是指在PDF文档中嵌入的其他文件,如图像、表格、音频、视频或其他文档。这些附件可以与PDF文档一起存储、传输和共享,为文档提供了更丰富的内容和更多的功能。通过添加附件,我们可以将相关文件和信息捆绑在一起,使其更易于管…...

Python可迭代对象排序:深入排序算法与定制排序
更多Python学习内容:ipengtao.com 排序在计算机科学中是一项基础而关键的操作,而Python提供了强大的排序工具来满足不同场景下的排序需求。本文将深入探讨Python中对可迭代对象进行排序的方法,涵盖基础排序算法、sorted函数的应用、以及定制排…...

基于matlab的图像去噪算法设计与实现
摘 要 随着我们生活水平的提高,科技产品飞速更新换代,在信息传输中,图像传输所占的比重越来越大。但自然噪声会在图像传输时干扰其传输过程,甚至会使图片不能表达其原来的意义。去噪处理就是为了去除图像中的噪声,从而…...

NFTScan 正式上线 Starknet NFTScan 浏览器和 NFT API 数据服务
2023 年 11 月 30 号,NFTScan 团队正式对外发布了 Starknet NFTScan 浏览器,将为 Starknet 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,Starknet 是继 Bitcoin、Ethereum、…...

2023年亚太杯APMCM数学建模大赛A题水果采摘机器人的图像识别
2023年亚太杯APMCM数学建模大赛 A题 水果采摘机器人的图像识别 原题再现 中国是世界上最大的苹果生产国,年产量约3500万吨。同时,中国也是世界上最大的苹果出口国,世界上每两个苹果中就有一个是中国出口的,世界上超过六分之一的…...
mysql which is not in SELECT list; this is incompatible with DISTINCT解决方案
mysql报错Expression #1 of ORDER BY clause is not in SELECT list, references column ‘xxx’ which is not in SELECT list; this is incompatible with DISTINCT解决方案: 这是在 mysql5.7 版本,DISTINCT 与 order by 在一起用时则会报3065错误。因…...
linux /proc 文件系统
/proc系统是一个伪文件系统,它只存在内存当中,而不占用外存空间,以文件系统的方式为内核与进程提供通信的接口。 /proc目录下有很多以数字命名的目录,每个数字代表进程号PID它们是进程目录。系统中当前运行的每一个进程在/proc下都…...

java开发之个微群聊自动添加好友
请求URL: http://域名/addRoomMemberFriend 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是String登录实例标识chatRoom…...
Git .gitignore 忽略文件不生效解决方法
.gitignore 匹配规则 *.sample # 忽略所有 .sample 结尾的文件 !lib.sample # 但 lib.sample 除外 /TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件 doc/*.txt # 会…...
【Java】16. HashMap
16. HashMap public static String find3(String key) {Map<String, String> map Map.of("bright", "小明","white", "小白","black", "小黑");return map.get(key); }Map.of 用来创建不可变的 Map&#…...

KMP基础架构
前言 Kotlin可以用来开发全栈, 我们所熟悉的各个端几乎都支持(除了鸿蒙) 而我们要开发好KMP项目需要一个好的基础架构,这样不仅代码更清晰,而且能共享更多的代码 正文 我们可以先将KMP分为前端和服务端 它们两端也能共享一些代码,比如接口声明,bean类,基础工具类等 前端和…...
递归实现选择排序.
思路: 1.定位数组中的最大元素或最小元素 2.将其与第一个元素交换位置 3.接着将剩余未排序的元素中的最大值或最小值与第二个元素交换位置 4.以此类推,直到排序完成 示例: [ 8, 5, 1, 9, 3 ] //原始数组 [ 1, 5, 8, 9, 3 ] //3与8交换 [ 1, 3, 8, 9, 5 ] //3与5交换 [ 1,…...

Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
目录 Node.js 文件系统模块(二) Node.js 文件系统模块(三) Node.js 文件系统模块(四) Node.js 路径模块 Node.js 连接 MySQL Node.js nodemon Node.js 操作 MySQL Node.js 应用 Node.js 文件系统模块…...

公司的销售经理面临哪些压力和挑战?
公司的销售经理面临哪些压力和挑战? 作为公司的销售经理,通常会面临以下挑战和压力: 1. 销售目标难以达成。销售经理需要承担销售目标,这通常是一项艰巨的任务。他们需要制定销售策略,与客户建立联系,并确保…...

【Linux系统编程】如何创建进程(什么是fork函数?进程创建的原理是什么?)
目录 一、前言 二、 进程创建的初次了解(创建进程的原理) 三、什么是fork函数? 💦初识fork函数 💦fork函数的四个为什么? ⭐为什么fork()要给子进程返回0,给父进程返回子进程pidÿ…...

【opencv】计算机视觉基础知识
目录 前言 1、什么是计算机视觉 2、图片处理基础操作 2.1 图片处理:读入图像 2.2 图片处理:显示图像 2.3 图片处理:图像保存 3、图像处理入门基础 3.1 图像成像原理介绍 3.2 图像分类 3.2.1 二值图像 3.2.2灰度图像 3.2.3彩色图像…...

Node——Node.js简介
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它能够让JavaScript脚本运行在服务端,这使得JavaScript成为与PHP、Python等服务端语言平起平坐的脚本语言。 1、认识Node.js Node.js是当今网站开发中非常流行的一种技术,它以简单易…...

小型洗衣机什么牌子好又便宜?性价比迷你洗衣机推荐
由于日常所穿的内衣裤由于各种原因,时间一久就很容易产生细菌,而且和其他大件的衣物一起混洗,很容易造成细菌的交叉感染,积攒起来洗就更不卫生了,留在内衣裤上的分泌物会继续滋生细菌,比如闷热的环境下念珠…...

INFINI Easysearch 与华为鲲鹏完成产品兼容互认证
何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云、私有云、混合云、桌面云)推出的一项合作伙伴计划,旨在为构建持续发展、合作共赢的鲲鹏生态圈,通过整合华为的技术、品牌资源,与合作伙伴共享商机和利…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...