后端数据库文档数据库【免费下载链接】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),仅供参考