首页/新闻资讯/正文详情

FerretDB Delete Operation 全解析:deleteOne 与 deleteMany 的用法、底层实现与最佳实践

发布时间:2026/9/24 14:38:09 来源:云帆数科 栏目:资讯中心
FerretDB Delete Operation 全解析:deleteOne 与 deleteMany 的用法、底层实现与最佳实践
后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载删除操作Delete Operation是 MongoDB 兼容文档数据库中最基础、最常用的写入操作之一用于在查询条件命中时从集合中移除文档。本指南以 FerretDB 官方文档 delete.md 为主线完整演示deleteOne()与deleteMany()的语法、返回值与实战案例并结合 FerretDB 仓库源码delete命令处理链、Data API 实现与集成测试剖析其底层原理。读完本文你将掌握在 FerretDB 中安全、精确地删除单条或多条文档的完整技能并理解删除操作在服务端的真实执行路径。删除操作概述删除操作在满足给定查询条件时从数据库中移除一个或多个文档。FerretDB 提供两种删除文档的方法deleteOne()仅删除第一条匹配查询条件的文档并将其从集合中完全移除deleteMany()删除所有匹配查询条件的文档。两种方法在底层都映射为 MongoDB wire 协议中的delete命令。在 FerretDB 的兼容性矩阵中delete命令的状态为Supported见 compatibility.md意味着你可以在 FerretDB 上使用与 MongoDB 一致的删除语义。两种方法的区别最终体现在delete命令的deletes[].limit字段上deleteOne()等价于limit: 1deleteMany()等价于limit: 0。这一约定由 integration/delete_test.go 中的测试用例直接验证limit只允许取0或1传入其他值如42.13、100会返回FailedToParse错误码 9——The limit field in delete objects must be 0 or 1。删除单条文档deleteOne()deleteOne()从集合中完全移除第一条匹配查询参数的文档db.collection.deleteOne({query_params})准备测试数据为直观演示先插入四位科学家scientist的文档db.scientists.insertMany([ { firstname: Thomas, lastname: Edison, born: 1847, invention: LightBulb, nobel: true }, { firstname: Graham, lastname: Bell, born: 1847, invention: telephone, nobel: false }, { firstname: Nikola, lastname: Tesla, born: 1856, invention: Tesla coil, nobel: false }, { firstname: Ada, lastname: Lovelace, born: 1815, invention: Computer programming, nobel: false } ])该操作返回响应acknowledged为true并包含四条已插入文档的ObjectId{ acknowledged: true, insertedIds: { 0: ObjectId(63470121d7a4a1b0b38eb2df), 1: ObjectId(63470121d7a4a1b0b38eb2e0), 2: ObjectId(63470121d7a4a1b0b38eb2e1), 3: ObjectId(63470121d7a4a1b0b38eb2e2) } }删除 nobel 为 false 的第一条文档接下来删除集合中nobel字段为false的文档即 Graham Bell 那条db.scientists.deleteOne({ nobel: false })操作返回结果显示恰好有一条文档被删除{ acknowledged: true, deletedCount: 1 }关键行为只删第一条匹配项需要注意deleteOne()只会删除匹配顺序中的第一条文档而非全部匹配项。在本例中nobel: false实际匹配三条文档Bell、Tesla、Lovelace但deletedCount仍为1。如果希望删除所有满足条件的文档必须使用deleteMany()。删除多条文档deleteMany()要一次删除多条文档使用deleteMany()方法。沿用前面的数据集删除所有nobel为false的文档db.scientists.deleteMany({ nobel: false })该命令会移除集合中所有匹配该查询条件的文档。执行后集合中仅剩nobel: true的 Thomas Edison 一条记录返回结果中的deletedCount为实际被删除的文档数量本例为3。常用查询条件扩展查询参数query_params支持完整的查询运算符让删除操作更加精准// 按范围条件删除 db.scientists.deleteMany({ born: { $lt: 1850 } }) // 组合条件删除 db.scientists.deleteMany({ nobel: false, born: { $gte: 1840 } }) // 使用逻辑运算符 db.scientists.deleteMany({ $or: [ { invention: telephone }, { born: 1815 } ] }) // 使用 _id 精确删除推荐用于单条删除 db.scientists.deleteOne({ _id: ObjectId(63470121d7a4a1b0b38eb2df) })使用_id作为条件进行deleteOne()是删除单条文档最精确、最安全的方式可避免误删。深入底层FerretDB 如何执行 delete 命令FerretDB 对deleteOne()/deleteMany()的支撑在服务端表现为完整的 wire 协议命令处理链。命令入口msgDelete客户端发送的delete命令由 internal/handler/msg_delete.go 中的msgDelete方法处理从请求体中解析出$db数据库名、deletes数组等参数通过连接池h.p.WithConn获取 PostgreSQL 连接调用documentdb_api.Delete执行真正的删除逻辑通过mongoerrors.MapWriteErrors将底层错误统一映射为 MongoDB 兼容的写错误格式。存储过程封装documentdb_api.Deleteinternal/documentdb/documentdb_api/documentdb_api.go 中的Delete函数是 PostgreSQL 存储过程documentdb_api.delete的 Go 封装其签名对应documentdb_api.delete( p_database_name text, p_delete documentdb_core.bson, p_insert_documents documentdb_core.bsonsequence DEFAULT NULL, OUT p_result documentdb_core.bson, OUT p_success boolean )它通过SELECT p_result::bytea, p_success FROM documentdb_api.delete(...)调用存储过程并带有 OpenTelemetry 追踪span 名为documentdb_api.Delete便于可观测性排查。集成测试验证integration/delete_test.go 从两个维度验证删除语义TestDeleteSimple验证DeleteOne对非空集合删除1条对不存在的集合删除0条不报错TestDelete通过db.runCommand({delete: collection, deletes: [...]})直接验证q查询条件与limit字段的解析规则——q缺失时返回错误码40414BSON field delete.deletes.q is missing but a required fieldlimit非法时返回错误码9FailedToParse。这说明即使直接以原生命令形式调用deleteFerretDB 也能保持与 MongoDB 一致的参数校验行为。通过 Data API 执行删除除了 MongoDB 驱动FerretDB 还内置了 Data API——一个兼容 OpenAPI 3.0 的 HTTP 接口无需 MongoDB 驱动即可完成insert、find、update、delete等操作见># 环境变量方式 FERRETDB_LISTEN_DATA_API_ADDR:8080 # 或启动参数方式 --listen-data-api-addr:8080Data API 将在http://localhost:8080提供服务若启用了认证需要在请求头或 URL 中携带凭据。调用 deleteOne 端点curl -X POST http://localhost:8080/action/deleteOne \ -H Content-Type: application/json \ -u username:password \ -d { database: db, collection: books, filter: { _id: pride_prejudice_1813 } }调用 deleteMany 端点curl -X POST http://localhost:8080/action/deleteMany \ -H Content-Type: application/json \ -u username:password \ -d { database: db, collection: books, filter: { authors.name: Jane Austen } }服务端实现要点Data API 的删除端点实现在 internal/dataapi/server/delete_one.go 与 internal/dataapi/server/delete_many.go 中。两者的差异正是limit字段DeleteOne构造删除文档时将limit设为1DeleteMany设为0。随后它们统一构造delete命令消息交给 handler 处理并从响应中取出n字段作为DeletedCount返回——与驱动调用的语义完全一致。删除操作的最佳实践与注意事项明确单删与多删的边界deleteOne()只删第一条匹配项deleteMany()删除全部匹配项。需要精确删除某条文档时优先用_id作为条件配合deleteOne()避免误删。先用查询验证再删除删除前可用db.collection.find({query_params}).count()或findOne()确认将要删除的文档范围降低风险。理解limit约束直接使用delete命令时deletes[].limit必须为0或1否则会收到FailedToParse错误码 9错误FerretDB 的行为与 MongoDB 保持一致。不存在即无操作当查询条件不匹配任何文档时删除操作不会报错deletedCount返回0TestDeleteSimple中不存在的集合用例验证了这一点。多入口选择无论使用 MongoDB 驱动、原生delete命令还是 Data API 的/action/deleteOne、/action/deleteMany端点最终都收敛到同一条服务端删除链路语义统一可按业务场景自由选择接入方式。延伸阅读官方删除操作文档website/versioned_docs/version-v2.7/usage/delete.md本文主要依据、website/docs/usage/delete.md删除命令服务端实现internal/handler/msg_delete.goPostgreSQL 存储过程封装internal/documentdb/documentdb_api/documentdb_api.go删除语义集成测试integration/delete_test.goData API 删除端点实现internal/dataapi/server/delete_one.go、internal/dataapi/server/delete_many.go兼容性矩阵website/docs/migration/compatibility.md赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐FerretDB Delete 操作全解deleteOne 与 deleteMany 的用法、语义与底层实现FerretDB Delete 操作全解deleteOne 与 deleteMany 的用法、语义与底层实现 删除操作Delete operation是后端数据库文档数据库iwara4a 安卓客户端安装与运行完整指南iwara4a 安卓客户端安装与运行完整指南 iwara4a 是一个基于 Jetpack Compose 开发的 Iwara 网站非官方安卓客户端支持登录、订后端数据库文档数据库Agent Zero 工作目录文件编辑 API 全解析/api/edit_work_dir_file 的契约、校验链与实现Agent Zero 工作目录文件编辑 API 全解析/api/edit_work_dir_file 的契约、校验链与实现 Agent Zero 的文件浏览器后端数据库文档数据库上一篇Llama-Guard-3-8B代码实战用Python构建自定义内容审核API的完整指南下一篇双窗口分不清谁激活colorful-winsep双窗口指示符功能完全配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Captura v8.0.0 版本深度解析:区域选择器、FFmpeg 编码、图像编辑与多音频源等 80 项新特性全梳理
Captura v8.0.0 版本深度解析:区域选择器、FFmpeg 编码、图像编辑与多音频源等 80 项新特性全梳理

桌面应用屏幕录制音视频 【免费下载链接】Captura Capture Screen, Audio, Cursor, Mouse Clicks and Keystrokes 项目地址: https://gitcode.com/gh_mirrors/ca/Captura 点击查看 免费下载 导读:v8.0.0 是 Captura(开源屏幕录制与截图工具&… · 2026/9/24 14:37:38

【C#桌面客户端系列学习-4】封装数据库基础操作工具类(CURD)
【C#桌面客户端系列学习-4】封装数据库基础操作工具类(CURD)

目录 一、安装MySQL驱动 二、数据库连接配置 三、数据库工具类封装 1、创建MySqlHelper类 2、验证创建成功 四、CURD操作示例 一、安装MySQL驱动 在VS2022中,右键项目 → 管理 NuGet 程序包,搜索并安装“MySql.Data”,这是MySQL官方的… · 2026/9/24 14:37:38

ParlAI 中的 Beat The Bot:一个让智能体在线学习交互的 Messenger 聊天机器人游戏
ParlAI 中的 Beat The Bot:一个让智能体在线学习交互的 Messenger 聊天机器人游戏

NLP人工智能深度学习 【免费下载链接】ParlAI A framework for training and evaluating AI models on a variety of openly available dialogue datasets. 项目地址: https://gitcode.com/gh_mirrors/pa/ParlAI 点击查看 免费下载 导读 本文聚焦 ParlAI 仓库中 p… · 2026/9/24 14:37:32

GitHub Copilot for Xcode 自定义工具实战:为 Xcode AI 助手构建并调试你的第一个专用工具
GitHub Copilot for Xcode 自定义工具实战:为 Xcode AI 助手构建并调试你的第一个专用工具

GitHub Copilot for Xcode 自定义工具实战:为 Xcode AI 助手构建并调试你的第一个专用工具 【免费下载链接】CopilotForXcode AI coding assistant for Xcode 项目地址: https://gitcode.com/GitHub_Trending/cop/CopilotForXcode 本文带你走一遍 GitHub Cop… · 2026/9/24 15:12:33

慢性心力衰竭所致下肢水肿:鉴别要点、高危诱因与长期规范化管理|合肥高新心血管病医院临床科普
慢性心力衰竭所致下肢水肿:鉴别要点、高危诱因与长期规范化管理|合肥高新心血管病医院临床科普

#摘要 下肢凹陷性水肿是慢性心力衰竭(CHF)最常见体征之一,但临床中易与肾源性、肝源性、静脉源性、内分泌源性水肿混淆。本文结合临床实践,梳理心衰相关下肢水肿的病理机制、临床鉴别要点、筛查方案与慢性心衰长期管理策略&#x… · 2026/9/24 15:12:33

EMQX HOCON 0.46.3 升级:数组型配置项敏感值脱敏与校验错误日志安全加固解析
EMQX HOCON 0.46.3 升级:数组型配置项敏感值脱敏与校验错误日志安全加固解析

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 仓库中 changelog 条目 fix-183… · 2026/9/24 15:12:27

Prometheus Operator 与 Thanos 集成实战:Sidecar 对象存储备份与 ThanosRuler 全局规则评估
Prometheus Operator 与 Thanos 集成实战:Sidecar 对象存储备份与 ThanosRuler 全局规则评估

云原生可观测性 【免费下载链接】prometheus-operator Prometheus Operator creates/configures/manages Prometheus clusters atop Kubernetes 项目地址: https://gitcode.com/gh_mirrors/pr/prometheus-operator 点击查看 免费下载 Thanos 是一组可组合的组件&am… · 2026/9/24 15:12:26

embeddingModel操作milvus数据库集合
embeddingModel操作milvus数据库集合

案例: 不是"创建集合的那一瞬间",而是"第一次使用时" // 应用启动时(MilvusConfig执行) // 步骤1: 创建milvusClient Bean public MilvusServiceClient milvusClient() {return new MilvusServiceClient(...); // ✓ 只是连接数据库 }// 步骤… · 2026/9/24 15:12:02

【Dv3Admin】Vue3动态配置首页仪表盘
【Dv3Admin】Vue3动态配置首页仪表盘

在做首页仪表板时,最麻烦的不是图表怎么画,而是组件来源动态、布局可拖拽、权限要隔离、还要能保存恢复。 Home 模块就是围绕这几件事做的一套标准化实现:后端下发组件定义与权限,前端负责动态渲染、拖拽布局、过滤无权限组件并紧… · 2026/9/24 15:12:02

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码