- 博客(33)
- 收藏
- 关注
原创 Cursor和Hbuilder用5分钟开发微信小程序
快速开发微信小程序只需5分钟!使用Hbuilder和Cursor两个工具:1)下载Hbuilder创建uniapp项目;2)运行到小程序模拟器;3)安装Cursor并用自然语言描述需求生成代码;4)预览效果并上传微信平台。特别演示了wifi二维码识别功能开发,通过详细指令让Cursor自动生成包括界面设计、弹窗提示等完整代码,大幅提升开发效率。
2025-09-09 09:33:28
663
1
原创 MongoDB源码delete分析CmdDelete过程collection()->deleteDocument
MongoDB的deleteDocument方法是实现文档删除的核心函数,主要流程包括:检查集合类型(拒绝固定集合删除)、获取文档快照并触发前置观察事件、可选保存删除文档副本、从索引目录移除记录、执行底层存储引擎删除操作,最后触发后置事件并更新调试指标。该方法严格遵循先索引后数据的删除顺序,并通过WiredTiger存储引擎实现具体删除操作,同时支持变更流等特性所需的删除文档存储功能。整个删除过程被包裹在事务中,确保操作原子性和一致性。
2025-09-02 09:19:57
711
原创 MongoDB源码delete分析CmdDelete策略DELTE>FETCH>IXSCAN执行分析
本文分析了MongoDB中deleteOne操作的执行流程和底层实现机制。deleteOne与deleteMany的主要区别在于删除文档数量,前者只删除第一个匹配文档。通过分析源码,发现deleteOne执行采用DELETE>FETCH>IXSCAN策略,核心调用链包括获取执行器、执行删除计划等步骤。具体实现中,DeleteStage通过子节点FetchStage和IndexScan获取待删除文档,最终调用collection的deleteDocument方法完成删除操作。文章详细解析了各阶段的
2025-08-26 09:41:15
774
原创 MongoDB源码delete分析CmdDelete过程
本文详细分析了MongoDB中deleteOne操作的执行过程。通过代码示例展示了deleteOne删除单条记录的基本用法,并使用explain()解析其执行计划为DELETE>FETCH>IXSCAN的三阶段流程。文章深入源码层面,梳理了从CmdDelete入口到具体删除操作的调用链,包括prepareExecution生成查询计划、getExecutorDelete获取执行器、以及最终执行删除的流程。特别分析了QueryPlanner如何为age字段索引生成IXSCAN扫描计划,并通过日志验
2025-08-19 09:59:27
740
原创 MongoDB分析insert源代码
mongo插入单条文档insert()主要分4个阶段:(1)分割文档,分批次插入(2)将文档传递给集合类插入(3)将文档传递给记录record插入(4)传递给引擎游标WiredTigerCursor插入
2025-08-12 09:35:29
982
原创 mongodb源代码分析创建db流程分析
摘要:MongoDB创建集合的核心代码位于create_collection.cpp,通过构建BSON格式元数据文档并插入到记录存储_mdb_catalog中。数据库操作通过AutoGetOrCreateDb获取,若不存在则调用openDb创建DatabaseImpl实例并初始化。初始化过程包括验证库名合法性、加载已有集合和视图目录,其中视图目录会校验持久化视图的正确性。整个流程涉及多级锁机制确保并发安全,同时处理数据库名称冲突等异常情况。
2025-08-04 20:51:32
1081
原创 mongodb源代码分析createCollection命令创建Collection流程分析
MongoDB提供了两种创建集合的方式:隐式创建和显式创建。隐式创建是推荐的方式,当向不存在的集合插入文档时,MongoDB会自动创建该集合。显式创建则使用createCollection()方法,允许用户自定义集合的配置选项,如文档大小限制、索引等。显式创建的核心方法run会解析命令、验证参数,并调用createCollection方法执行创建动作。创建过程中,MongoDB会检查数据库和集合名称的合法性,确保不与系统名称冲突,并处理集合的存储引擎选项、索引配置等。最终,通过存储引擎(如WiredTige
2025-07-28 09:12:03
614
原创 mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程
buildscripts/idl/idl/generator.py把create.idl转成create_gen.cpp和create_gen.h,再编译成create_gen.obj,CreateCommand对象封装命令createCollection。
2025-07-21 09:27:41
1077
原创 MongoDB源码分析向客户端asyncSinkMessage返回执行结果DbResponse
MongoDB请求处理流程分析:状态机从Created依次转变为Source、SourceWait、Process、SinkWait等状态。核心_processMessage方法负责处理客户端请求,主要逻辑包括:1) 解压缩消息;2) 通过handleRequest执行数据库操作获取DbResponse;3) 构建响应消息头;4) 处理getMore特殊逻辑;5) 通过_sinkMessage异步发送响应。网络层通过session_asio的asyncSinkMessage将响应写入Socket。
2025-07-15 09:28:22
775
原创 mongod源代码Find的QueryPlanner::plan评分最高计划put到cache流程分析
b.user.find({age:28}).sort({wages:1})的缓存键为eqage~awages<1>,其中eqage表示过滤条件,awages表示排序字段,<1>表示索引是否起作用。通过这种机制,MongoDB能够有效减少重复查询的优化时间,提升整体性能。
2025-07-07 10:01:55
894
原创 mongod源代码Find的QueryPlanner::plan多个执行计划评分最高计划exec流程分析
在执行db.user.find({age:28}).sort({wages:1})命令时,MongoDB通过FindCmd的run方法解析命令并生成执行计划。重点分析了getExecutorFind()方法,该方法通过QueryPlanner::plan()生成执行计划。根据命令参数,生成了两个执行计划:方案1使用age索引进行扫描,方案2使用wages索引进行扫描。经过评分,方案1的评分更高,因此被选为最终执行计划。方案1的执行流程为:IXSCAN(读取age索引范围内的数据)→ FETCH → SORT
2025-07-03 09:24:42
1090
原创 mongod源代码Find的QueryPlanner::plan解析出来1个执行计划exec流程分析
在MongoDB中,执行db.user.find({age:28})查询时,系统会调用FindCmd的run方法,经过解析命令、生成执行计划和运行执行计划三个步骤。本文重点分析了生成执行计划的过程,特别是通过getExecutorFind()方法生成执行计划的流程。执行计划通常包括IXSCAN(索引扫描)和FETCH(数据获取)两个阶段。IXSCAN负责根据索引查找数据,而FETCH则根据索引结果获取实际文档。执行计划的生成过程涉及解析查询参数、选择合适的索引,并最终生成一个执行计划树。日志记录显示,系统首
2025-06-30 09:34:59
736
原创 mongodb源代码Find命令QueryPlanner::plan生成多个执行计划指定hint一个索引方案
在MongoDB中,执行计划的生成受到多个因素的影响,包括过滤器中的字段、索引、排序、投影等。对于查询db.user.find({age:28}).sort({wages:1}),MongoDB会通过QueryPlanner::plan生成执行计划。如果age是索引字段,执行计划会先进行索引扫描(IXSCAN),然后进行数据获取(FETCH),最后进行排序(SORT)。如果wages是索引字段,执行计划会直接使用索引扫描(IXSCAN)并获取数据(FETCH)。MongoDB会根据评分选择最优的执行计划。如
2025-06-24 09:32:50
1133
原创 mongod源代码Find的QueryPlanner::plan多个执行计划选择pickBestPlan高评分策略
MongoDB查询优化器选择执行计划的过程分析:对于查询db.user.find({age:28}).sort({wages:1}),系统生成两个候选方案:方案1使用age索引进行过滤后排序(IXSCAN>FETCH>SORT_KEY_GENERATOR>SORT),方案2直接使用wages索引(IXSCAN>FETCH)。通过MultiPlanStage的评估机制,系统运行两个计划各10000次(numWorks)或直到返回101条结果(numResults)。评分机制综合考虑:基
2025-06-20 09:46:21
1241
原创 mongod源代码Find的QueryPlanner::plan解析出来2个执行计划案例流程分析
FindCmd命令生成执行计划的影响因素包括:过滤器中是否有_id字段、是否有索引字段、是否有空间索引字段、是否有TEXT索引字段、命令中是否有sort、是否有projection字段以及是否进行全表扫描。例如,在user表中,字段age和wages建立了索引。对于命令db.user.find({age:28}).sort({wages:1}),由于age是索引字段,生成执行计划IXSCAN(索引age=1)>FETCH。此外,由于wages也是索引字段,生成了排序执行计划。其他条件不符合,未生成其他
2025-06-17 09:35:59
885
原创 mongod源代码Find的QueryPlanner::plan解析出来1个执行计划案例流程分析
db.user.find({age:2});调用FindCmd的run方法,1、解析命令(过滤器、排序、返回字段)2、根据命令参数生成执行计划 3、运行执行计划。下面重点分析2、根据命令参数生成执行计划getExecutorFind()
2025-06-12 09:32:47
1049
原创 mongod源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,状态转变流程是:State::Created 》 State::Source 》State::SourceWait 》 State::Process 》 State::SinkWait 》 State::Source 》State::SourceWait。
2025-06-09 09:33:09
961
原创 mongod源码分析session异步接受asyncSourceMessage()客户端流变Message对象
本文分析了MongoDB服务状态机中消息接收过程的关键实现。主要流程包括:1) ASIOSession从Created到Source等状态转换;2) 异步接收客户端消息的调用链,涉及_sourceMessage、asyncSourceMessage等方法;3) 消息格式解析,包含标准MsgHeader和特定数据;4) 两种线程模型(adaptive和synchronous)的处理差异;5) 底层opportunisticRead实现异步数据读取。重点剖析了动态线程模式下异步获取消息的完整流程,从网络层读取、
2025-06-05 18:13:56
1194
原创 mysql的表怎么手动迁移到MongoDB数据库
为了将MySQL中的department和user表迁移到MongoDB并进行关联join性能测试,可以采用以下步骤:首先,从MySQL导出数据为CSV文件,确保使用逗号作为分隔符,并添加标题行,将id字段改为_id。然后,使用MongoDB的mongoimport工具将CSV文件导入到MongoDB中,指定数据库、集合名称,并使用--headerline参数确保CSV的第一行作为字段名。这种方法避免了编写代码进行数据迁移,简化了迁移过程。
2025-06-03 09:55:28
478
原创 mongod源码分析session接受find命令-执行命令-返回数据给客户端-概要流程
mongo第一条命令状态转变流程是:State::Created 》 State::Source 》State::SourceWait 》 State::Process 》 State::SinkWait 》 State::Source 》State::SourceWait。session等待connection请求,状态转变流程:State::Created 》 State::Source 》State::SourceWait,最后调用_sinkMessage,将mongodb结果数据发送给客户端。
2025-05-29 09:18:45
1233
原创 mongodb语法$vlookup性能分析
在MongoDB中,查询level下有多少用户时,使用user表$vlookup department表的方法比department表$vlookup user表的方法更快。原因在于user表的_id字段有索引,而department_id字段没有索引。user表$vlookup department表的方法首先读取user表的department_id值,然后通过department表的_id字段进行关联,由于_id字段有索引,查询速度更快。而department表$vlookup user表的方法需要遍
2025-05-24 17:55:55
789
原创 mongod源码分析startSession()接受客户端connection连接过程
scheduleNextWithGuard()接口最核心的作用就是调用service_executor服务运行子模块(线程模型子模块)的schedule()接口来把状态机调度任务入队到ASIO网络库的一个全局队列(adaptive动态线程模型),如果是一个链接一个线程模型,则任务入队到线程级私有队列。和ctx->setServiceExecutor(std::make_unique<ServiceExecutorAdaptive>(ctx, std::move(reactor)));创建异步模型执行器。
2025-05-20 09:37:16
1198
原创 mongod源码分析WiredTiger存储引擎内存计算逻辑
例如,在总 RAM 为 4GB 的系统上,WiredTiger 缓存使用 1.5GB RAM (0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,在总 RAM 为 1.25GB 的系统上,WiredTiger 为 WiredTiger 缓存分配了 256 MB,因为这大于总 RAM 的一半减去 1 GB (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)。WiredTiger 内部缓存中的集合数据未压缩,并使用与磁盘上格式不同的表示形式。
2025-05-15 09:27:47
700
原创 mongod源码分析WiredTigere存储引擎StorageEngin实例化流程
当mongod 启动时,初始化存储引擎在src/mongo/db/storage/storage_engine_init.cpp中的 initializeStorageEngine() 函数里。mongodb启动之后,数据data文件夹有几个重要文件:mongod.lock,storage.bson,WiredTiger.lock,WiredTiger,WiredTiger.wt,sizeStorer,journal等
2025-05-12 09:30:05
1362
原创 mongod4.0.7源码入口全局上下文ServiceContext分析
同步线程模式也就是一个链接一个线程模型,线程数的多少和链接数的多少成正比,链接数越多则线程数也越大。当服务端接收到客户端新连接事件通知后,会触发执行acceptCb()回调,该回调中底层ASIO库通过epol wait获取到所有的accept事件,每获取到一个accept事件就代表一个新的客户端链接,然后调用ServiceEntryPointlmp.::startSession()接口处理这个新的链接ASIOSession,整个过程递归执行,保证一次可以处理所有的客户端accept请求信息。
2025-05-09 09:39:16
978
原创 mongodb源代码分析sql用到数据例子
mongo显示隐藏字段showRecordId(),mongo系统默认字段,自增,用于索引和记录对应关系。mongo查看数据库列表命令:show databases。mongo查看集合列表show collections。mongo查看索引getIndexes()mongo分析sql命令explain()mongo插入单条文档insert()mongo查看数据列表find()mongo切换数据库use db。客户端连接mongod服务。mongo删除一条数据。mongo修改一条数据。
2025-05-07 17:05:34
285
原创 mongod4.0.7源码分析加载mongod.conf流程
mongo配置文件是mongod.conf,如果是linux系统apt安装,默认的路径是/etc/mongod.conf。mongod启动命令手动指定路径mongod --config /etc/mongod.conf。mongod.conf配置文件常见的配置参数有net.port: 27017,storage.dbPath: /var/lib/mongodb,storage.engine: wiredTiger。
2025-05-05 16:33:35
2022
原创 mongodb 分析 explain () 源码基础入门
db.user.explain().count({"_id" : ObjectId("67ed4c116e8444c140bf255f"),name:"conca"}) 执行策略是:IXSCAN > FETCH > COUNT。db.user.explain().find({"_id" : ObjectId("67ed4c116e8444c140bf255f"),name:"conca"}) 执行策略是:IXSCAN > FETCH。explain()方法是一个非常有用的工具,可用于分析查询的执行情况。
2025-05-01 19:40:27
1037
原创 mongo4.0.7源代码下载编译启动运行
mongodb4.0.7源代码win10环境Visual Studio 2017(开始使用的是Visual Studio 2022,编译的时候版本对不上,需要修源代码地方比较多)Visual Studio 2017安装插件【使用C++的桌面开发】,对应CV++ 是14.1版本。
2025-04-30 09:22:44
771
原创 mongod4.0.7 启动到执行 SQL 源码分析全流程
mongod服务器启动,客户端建立连接,接受命令,执行命令,返回结果。本篇主要列出流程,后面会对每个流程进行细化源码分析。大家有什么疑问或者想了解知识,可以留言,后续会增加进去。service_entry_point_common.cpp收到执行命令receivedCommands。execCommandDatabase、runCommandImpl执行命令。接受客户端发送来的请求, _sourceMessage。根据命令名字"find"从中CommandMap获取。
2025-04-28 09:40:30
307
转载 基于netty的企业即时通讯系统的设计与实-离线消息处理
离线消息和在线消息只能分开,离线消息因为安卓上面会被各种因素影响,只能用大厂的推送通道,他们有足够多的app可以互相叫醒,在线消息得自己做,因为推送通道的响应速度不行。
2016-03-31 09:23:08
3245
转载 基于netty的企业即时通讯系统的设计与实-服务器消息重发
服务器把消息发送出去,服务器记录这条消息的状态,客户端如果收到这条消息,向服务器发送一个回执,服务器收到这个回执将状态修改成已经收到,如果一定时间没有收到回执,则再次发送这条消息。
2016-03-30 10:09:17
4279
转载 android编译源码5.1.1刷真机nexus5系统
作为一名android开发者,只会开发代码,那是不行的。怎么也得玩玩android源码系统,自己编译一下源码5.1.1,把自己编译的系统刷机到nexus5真机。首先要查清楚nexus5对应的版本和代号,设备nexus5支持哪些android源码分支android版本号对应列表环境和工具列表工具备注debain6官方提供的文档都
2016-03-24 14:08:56
2474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人