提高MongoDB效率九大优化方式

MongoDB九大优化方式:
第一:单次批量查询比循环逐条查询更快;
循环查询是开发者最常犯的错误写法。循环嵌套查询写代码快,逻辑简单,最耗时。在小批量数据处理时间一般远小于数据库查询时间。所以尽量避免增加查询次数,能把多次查询合并成单次批量查询尽量查询。解决办法:先预处理把查询字段合并成一个数组,然后数组中的同类项,接着用批量查询(包括管道操作),转成map,最后用map的get方法查找数据。

let list = await VRRecord.find({type: '航拍',status: {$in: ['', null, 'FINISH']}}, '-_id -estate_id -views_num').sort({create_time: -1}).lean().exec();// let time1 =  new Date().getTime();// logger.debug('time1-time0:', time1-time0, 'list.length:', list.length);// 使用map和concat来遍历list,并提取每个元素的estates数组let newList = [].concat(...list.map(item => {// 确保estates是一个数组return Array.isArray(item.estates) ? item.estates : [];}));// 使用Set来去除重复的newList = Array.from(new Set(newList));// logger.debug('newList:', newList);let subUserMap = new Map();if(newList.length > 0){let realEstateList = await EstateModel.find({id: {$in: newList}},'-_id id real_estate_name').lean().exec();subUserMap = new Map(realEstateList.map(item => [item.id, item]));}// logger.debug('subUserMap:', subUserMap);let newList2 = [].concat(...list.map(item => {// 确保lands是一个数组return Array.isArray(item.lands) ? item.lands : [];}));// 使用Set来去除重复的newList2 = Array.from(new Set(newList2));// logger.debug('newList:', newList);let subUserMap2 = new Map();if(newList2.length > 0){let matchLands = await LandModel.find({id: {$in: newList2}},'-_id id name').lean().exec();subUserMap2 = new Map(matchLands.map(item => [item.id, item]));}let nameMap = {};for (let i=0; i<list.length; i++) {list[i].hasMarker = false;if (list[i].markers) {for (let key in list[i].markers) {if (list[i].markers[key].length) {list[i].hasMarker = true;break;}}}delete list[i].markers;let matchEstates = [];if (list[i].estates) {for (let k=0; k<list[i].estates.length; k++) {let id = list[i].estates[k];if (!nameMap[id]) {let realEstate = subUserMap.get(id);// await EstateModel.findOne({//     id: id// },'-_id id real_estate_name').lean().exec();nameMap[id] = realEstate;}if (nameMap[id]) {matchEstates.push(nameMap[id]);}}}list[i].real_estate_name = matchEstates.map(x => x.real_estate_name).join(',');list[i].matchEstates = matchEstates;if (list[i].lands) {let newLands = [];list[i].lands.forEach(land =>{if(land){let item = subUserMap2.get(land);if(item){newLands.push(item);}}});// let matchLands = await LandModel.find({//     id: {$in: list[i].lands}// }, 'id name -_id');list[i].matchLands = newLands;//matchLands;}}

这种修改可以把原来嵌套查询达到12秒的处理时间降低到0.3秒

第二:尽量避免嵌入不断增加的数据;
MongoDB存储数据的机制决定了对数组不断追加数据是很低效的。在正常使用中数组和对象大小应该相对固定。
第三:预填充数据;
比如统计每个小时的访问量,先建一个24个0的数组。
第四:尽可能预先分配空间;
知道文档开始比较小,后面会变为确定的大小的,可以先存个确定大小的填充字段,再删除( u n s e t ) 这个字段。如果存储文档时便为其分配将来所需的空间,之后便不再需要移动它。第五:文档要自给自足; M o n g o D B 只存取数据,不做计算。计算尽量在客户端(包括调用 M o n g o D B 的后台服务器)完成。第六:避免使用 unset)这个字段。如果存储文档时便为其分配将来所需的空间,之后便不再需要移动它。 第五:文档要自给自足; MongoDB只存取数据,不做计算。计算尽量在客户端(包括调用MongoDB的后台服务器)完成。 第六:避免使用 unset)这个字段。如果存储文档时便为其分配将来所需的空间,之后便不再需要移动它。第五:文档要自给自足;MongoDB只存取数据,不做计算。计算尽量在客户端(包括调用MongoDB的后台服务器)完成。第六:避免使用where;
第七:编写代码处理数据完整性问题;
在后台执行一些检查和保护数据的脚本,能解除很多后顾之忧,避免出现脏数据。
第八:使用正确的类型;
数据类型影响数据的查询方式、数据存放顺序、占用多少空间。数字,日期,字符串。
第九:用简单唯一的id替换掉_id。
节省空间,注意这个唯一id要是唯一的。原来_id具有递增不重复的作用,代替它的id也有具有该功能来避免出现脏数据。

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

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

相关文章

软件需求规格说明书(Word原件@配套软件全资料)

软件需求规格说明书编写规范编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任…

爬虫学习--17.反爬斗争 selenium(2)

鼠标行为链 有时候在页面中的操作可能要有很多步&#xff0c;那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。 actions ActionChains(driver) actions.move_to_element(inputTag) actions.send_keys_to_element(inputT…

Optional类

一、概述 泛型类、java8引进的、java.util包里 二、作用 解决空指针异常带来的不便 三、做法 将对象封装为一个Optional对象&#xff0c;如果封装的对象为空&#xff08;即该对象不存在&#xff09;&#xff0c;可以使用默认值和或者执行默认操作 四、方法 1、empty() 创…

【Qt知识】Qt Creator快捷键

以下是Qt Creator中的一些常用快捷键列表&#xff08;持续更新&#xff09;&#xff1a; 基本编辑 多行注释/取消多行注释: Ctrl /编译工程: Ctrl B运行工程: Ctrl R整行上移/下移: Ctrl Shift ↑/↓查找: Ctrl F函数声明和定义切换: F2向下查找: F3头文件和源文件切换:…

【postgresql初级使用】初识触发器,在数据行发生变化时自动执行用户行为,也可以SQL级别触发,特别是视图上可以有触发器了

初识触发器 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 初识触发器概…

【成品设计】基于RT-thread星火开发板的智能监测系统设计

《基于RT-thread星火开发板的智能监测系统设计》 所需器件&#xff1a; 主控&#xff1a;STM32F407星火开发板。温湿度传感器&#xff1a;采集当前环境中的温湿度。环境传感器&#xff1a;采集当前环境中的光照强度。CO2传感器&#xff0c;采集当前环境中的C02浓度。粉尘传感…

excel怎么对非数字求和汇总?

如&#xff1a;学生小王的成绩为&#xff1a;A&#xff0c;A&#xff0c;A&#xff0c;A&#xff0c;B&#xff0c;B-……想得到的成绩汇总求和为&#xff1a;2A,2A,1B,1B- 如果在低版本里&#xff0c;用公式计算可能相当复杂&#xff0c;但是有了TEXTJOIN函数和UNIQUE函数&…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)

校园交友网站 目录 基于SprinBootvue的校园交友网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

AKG K450配什么前端:深度解析与最佳搭配指南

AKG K450配什么前端&#xff1a;深度解析与最佳搭配指南 在音频世界里&#xff0c;选择一款合适的前端设备对于耳机音质的发挥至关重要。AKG K450作为一款备受好评的耳机&#xff0c;其音质细腻、低频饱满&#xff0c;但要想真正发挥其潜力&#xff0c;就需要找到一款与之相匹…

CSS学习笔记:bootstrap的介绍、下载、使用及响应式布局的实现

介绍 Bootstrap 是由 Twitter 公司开发维护的前端 UI 框架&#xff0c;它提供了大量编写好的CSS 样式 bootstrap过时了吗&#xff1f; 其实在学bootstrap这一部分的网课时&#xff0c;在弹幕上看到一些同学说bootstrap已经过时了&#xff0c;这里谈谈我的看法 我的前端学习…

3天13部,端午档电影数何以是五一档2倍?

离端午还有12天&#xff0c;院线端午档再上热搜。 截止至5月29日&#xff0c;本次端午档将有13部电影在3天的节假日内集中上映&#xff0c;这一数量仅比2021年端午档的最高纪录少了2部&#xff0c;几乎是今年五一档期上映影片数量&#xff08;7部&#xff09;的两倍。 并且与…

使用OpenCV创建全景图像

使用OpenCV创建全景图像 前言图像拼接策略创建全景图像相关链接前言 在本节中,我们将学习组合多个图像来创建全景图像。使用相机拍摄全景照片时,通常会拍摄多张照片,通过算法将这些图像中共同存在的元素(从左到右)映射到一张单独的图像中。为了执行图像的拼接,将利用 cv2 …

UE5 Http Server

前言 最近要用UE 作为一个服务器去接收来自外部的请求&#xff0c;从而在UE中处理一些内容&#xff0c;但是之前只做过请求&#xff0c;哪整过这玩意&#xff0c;短期内还得出结果&#xff0c;那怎么搞嘞&#xff0c;本着省事的原则就找找呗&#xff0c;有没有现成的&#xff0…

计算机网络- 特定服务类型(Type of Service, TOS) 服务质量(Quality of Service, QoS)

特定服务类型&#xff08;Type of Service, TOS&#xff09; 具有特定服务类型&#xff08;Type of Service, TOS&#xff09;的数据包是指在IP头部中包含特定TOS字段设置的数据包。TOS字段用于指示数据包的服务质量要求&#xff0c;如延迟、吞吐量、可靠性等。现代IP网络通常…

结构体中内存的对齐

前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指针进阶&#xff0c;这一章我来聊一聊C语言内存对齐的问题 学习结构体的你有没有注意过结构体向系统申请的内存为多少呢的&#x1f601; 思考 #include<stdio.h> typedef struct s1 {char a;char …

Qt6同时使用Qt3DCore与QtGUI时QTransform类冲突问题

在Qt GUI模块有一个QTransform类&#xff0c;在Qt3D Core模块也有一个QTransform类&#xff0c;如果不特殊指定一下会报错

全新/二手KEITHLEY 2400 数字万用表

吉时利Keithley 2400数字源表&#xff0c;200V&#xff0c;1A&#xff0c;20W Keithley 2400 源表是一款 20W 仪器&#xff0c;可输出和测量 5V&#xff08;输出&#xff09;和 1V&#xff08;测量&#xff09;至 200V DC 的电压以及 10pA 至 1A 的电流。该万用表功能包括高重复…

【linux深入剖析】进程间通信

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.进程间通信目的2. 什么…

layui实现鼠标移入/移出时显示/隐藏tips

layui实现鼠标移入/移出时显示/隐藏tips弹窗 注&#xff1a;其它弹窗亦可按照此方法实现相同效果 鼠标移入 dom 或 tips 区域&#xff0c;显示 tips 弹窗&#xff1b; 鼠标移出 dom 或 tips 区域&#xff0c;隐藏 tips 窗口&#xff1b; <div id"box">鼠标移入…

如何发布自己的 npm 包

创建 npm 包项目 创建项目目录&#xff1a; 在本地创建一个新的项目目录&#xff0c;并进入该目录。 初始化项目&#xff1a; 在命令行中运行以下命令初始化 npm 项目&#xff1a; npm init 按照提示填写项目信息&#xff0c;包括包名、版本、描述等。 编写代码 在项目目录…