当前位置: 首页 > news >正文

数据库应用: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)解决方法

修改命令

相关文章:

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

目录 一、理论 1.MongoDB文档管理 2.MongoDB索引管理 二、实验 1.MongoDB文档管理 2.MongoDB索引管理&#xff08;索引添加与删除&#xff09; 3.MongoDB索引管理&#xff08;全文索引&#xff09; 4.MongoDB索引管理&#xff08;多列索引&#xff09; 5.MongoDB索引管…...

Python批处理PDF文件,PDF附件轻松批量提取

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

Python可迭代对象排序:深入排序算法与定制排序

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

基于matlab的图像去噪算法设计与实现

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

NFTScan 正式上线 Starknet NFTScan 浏览器和 NFT API 数据服务

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

2023年亚太杯APMCM数学建模大赛A题水果采摘机器人的图像识别

2023年亚太杯APMCM数学建模大赛 A题 水果采摘机器人的图像识别 原题再现 中国是世界上最大的苹果生产国&#xff0c;年产量约3500万吨。同时&#xff0c;中国也是世界上最大的苹果出口国&#xff0c;世界上每两个苹果中就有一个是中国出口的&#xff0c;世界上超过六分之一的…...

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解决方案&#xff1a; 这是在 mysql5.7 版本&#xff0c;DISTINCT 与 order by 在一起用时则会报3065错误。因…...

linux /proc 文件系统

/proc系统是一个伪文件系统&#xff0c;它只存在内存当中&#xff0c;而不占用外存空间&#xff0c;以文件系统的方式为内核与进程提供通信的接口。 /proc目录下有很多以数字命名的目录&#xff0c;每个数字代表进程号PID它们是进程目录。系统中当前运行的每一个进程在/proc下都…...

java开发之个微群聊自动添加好友

请求URL&#xff1a; http://域名/addRoomMemberFriend 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRoom…...

Git .gitignore 忽略文件不生效解决方法

.gitignore 匹配规则 *.sample    # 忽略所有 .sample 结尾的文件 !lib.sample    # 但 lib.sample 除外 /TODO    # 仅仅忽略项目根目录下的 TODO 文件&#xff0c;不包括 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 文件系统模块&#xff08;二&#xff09; Node.js 文件系统模块&#xff08;三&#xff09; Node.js 文件系统模块&#xff08;四&#xff09; Node.js 路径模块 Node.js 连接 MySQL Node.js nodemon Node.js 操作 MySQL Node.js 应用 Node.js 文件系统模块…...

公司的销售经理面临哪些压力和挑战?

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

【Linux系统编程】如何创建进程(什么是fork函数?进程创建的原理是什么?)

目录 一、前言 二、 进程创建的初次了解&#xff08;创建进程的原理&#xff09; 三、什么是fork函数&#xff1f; &#x1f4a6;初识fork函数 &#x1f4a6;fork函数的四个为什么&#xff1f; ⭐为什么fork()要给子进程返回0&#xff0c;给父进程返回子进程pid&#xff…...

【opencv】计算机视觉基础知识

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

Node——Node.js简介

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

小型洗衣机什么牌子好又便宜?性价比迷你洗衣机推荐

由于日常所穿的内衣裤由于各种原因&#xff0c;时间一久就很容易产生细菌&#xff0c;而且和其他大件的衣物一起混洗&#xff0c;很容易造成细菌的交叉感染&#xff0c;积攒起来洗就更不卫生了&#xff0c;留在内衣裤上的分泌物会继续滋生细菌&#xff0c;比如闷热的环境下念珠…...

INFINI Easysearch 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…...

植入式网络广告效果影响因素及投放决策优化【附代码】

✨ 长期致力于植入式网络广告效果、产品植入形态、广告呈现方式、载具属性、品牌知名度研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;多因素交互实验…...

Image2.0生成的PPT图片转换成可编辑的PPT的一种方法

老弟&#xff0c;PPT不想做&#xff0c;用AI生成的PPT图片编辑不了很烦恼是吧&#xff0c;俺有一法&#xff01;~ Edit Banana&#xff08;最强&#xff0c;开源免费&#xff09; 能把 AI 图→可编辑 PPTX / DrawIO / SVG 原理&#xff1a;用 SAM 分割图标 / 形状&#xff0c;用…...

2026年国内镜像站安全与效率评测:GPT-5.5的真实体验

在国内访问海外大模型&#xff0c;延迟高、连接不稳、支付合规是老生常谈的三座大山。为了完成本次GPT-5.5的全流程实测&#xff0c;我借助库拉AI聚合平台完成了所有调用——该平台支持国内外主流AI模型的统一对接&#xff0c;国内可直连访问&#xff0c;注册用户每日提供可用额…...

taotoken如何为github actions工作流提供稳定的大模型服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken如何为github actions工作流提供稳定的大模型服务 应用场景类&#xff0c;探讨在github actions自动化流水线中集成taotok…...

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成流程详解

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成流程详解。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

React Props:深入解析组件间的数据传递

React Props:深入解析组件间的数据传递 在React中,组件间的数据传递是构建复杂应用的关键。Props(属性)是React组件间数据传递的主要方式,它允许父组件向子组件传递数据。本文将深入探讨React Props的概念、使用方法以及注意事项。 一、Props的概念 Props是React组件的…...

Perplexity反义词≠低困惑度?——斯坦福NLP实验室内部培训材料首次公开的4层认知陷阱

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity反义词≠低困惑度&#xff1f;——认知错位的根源剖析 Perplexity&#xff08;困惑度&#xff09;是语言模型评估中被广泛误读的核心指标。许多人直觉认为“低困惑度即好模型”&#xff0c;甚至将“…...

今年小满不一般,老辈农谚里藏着农事提醒

2026 年的小满节气在 5 月 21 日 8:36:28 交节&#xff0c;不少人说今年小满不一般&#xff0c;老辈农谚里总结了三个特点&#xff0c;对农事有不少参考意义。1. 白天小满&#xff0c;昼夜温差变化大“白天小满凉嗖嗖&#xff0c;晚上小满热死牛”这句农谚是说&#xff0c;如果…...

CANN Rotary Embedding 融合算子:解锁千问大模型推理性能的 3 倍密钥

CANN Rotary Embedding 融合算子&#xff1a;解锁千问大模型推理性能的 3 倍密钥 导语&#xff1a;在大模型推理的“微操”中&#xff0c;位置编码&#xff08;Positional Encoding&#xff09;往往被视为理所当然的开销。然而&#xff0c;在昇腾&#xff08;Ascend&#xff0…...

Windows右键菜单终极优化指南:如何用ContextMenuManager让右键菜单快速响应

Windows右键菜单终极优化指南&#xff1a;如何用ContextMenuManager让右键菜单快速响应 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows右键菜单卡…...