HOWTO · MongoDB
在 MongoDB Shell 中删除集合的所有记录
在这篇 MongoDB 文章中,你将通过几个示例了解如何使用 MongoDB 删除集合中的记录。我们将通过实现各种操作的示例来讨论这一点。
本页内容
要清空 MongoDB 集合中的文档,同时保留集合本身,请在 mongosh 中运行 db.teams.deleteMany({}),并将 teams 替换为你的集合名称。空筛选条件 {} 会匹配所有文档,因此此命令会删除该集合中的所有文档。若要连同索引一起删除集合,请改用 db.teams.drop()。执行这两种删除操作前,请确认当前数据库和集合。
以下示例使用 teams 集合。MongoDB 的删除方法接受一个筛选文档:字段条件会缩小匹配范围,而空筛选条件会匹配所有文档。deleteOne() 最多删除一个匹配的文档;deleteMany() 会删除所有匹配的文档。
选择删除文档还是删除集合
根据操作后要保留的内容选择相应方法:
- 使用
deleteOne(filter)删除至多一个与filter匹配的文档。 - 使用
deleteMany(filter)删除所有与filter匹配的文档。 - 使用
deleteMany({})删除所有文档,同时保留集合。 - 使用
db.teams.drop()删除集合本身及其索引。
空筛选条件会带来重要影响:deleteOne({}) 会删除一个匹配的文档,但不会保证选中哪个文档,也不保证选中集合顺序中的第一条。deleteMany({}) 会匹配所有文档。如果只想删除部分记录,就不要用它代替有针对性的筛选条件。
删除一个匹配的文档
向 deleteOne() 传入筛选条件,即可指定要匹配的文档。例如,db.teams.deleteOne({ team: "Arsenal" }) 最多删除一个 team 字段值为 "Arsenal" 的文档。如果有多条文档匹配,此方法仍只会删除其中一条,不会删除所有 Arsenal 记录。需要删除所有匹配项时,请使用 deleteMany()。
调用 db.teams.deleteOne({}) 同样最多删除一条文档,因为空筛选条件会匹配所有文档。MongoDB 不保证删除的是集合顺序中的第一条。要清空集合,请改用 deleteMany({})。
删除集合中的所有文档
如果要删除所有符合某个条件的文档,请将条件传给 deleteMany()。例如,db.teams.deleteMany({ team: "Manchester" }) 会删除所有 team 字段值恰好为 "Manchester" 的文档,并保留其他球队的文档。匹配依据是字段中存储的值;如果删除数量少于预期,请检查数据中的拼写和空格。
若要清空集合但保留集合本身,请运行 db.teams.deleteMany({})。由于 {} 不包含字段条件,所有文档都会匹配。文档被删除后,集合仍可供后续插入使用。如果只想删除部分记录,请勿使用这个空筛选条件。如果不再需要集合本身,请使用上文介绍的 drop 操作。
下面的独立 JavaScript 示例简要演示如何从内存列表中删除所有 team 值为 Manchester 的文档。它不会连接 MongoDB;请在数据库中使用上面的 mongosh 命令。代码示例及其显示的 Liverpool 输出保持英文,以遵循规范示例的字节一致性要求。
本节中的代码以及显示的标签或输出仍为英文。
const teams = [
{ team: "Manchester", points: 70 },
{ team: "Liverpool", points: 69 },
{ team: "Manchester", points: 50 }
];
const filter = { team: "Manchester" };
const remaining = teams.filter(document => document.team !== filter.team);
console.log(remaining.map(document => document.team).join(", "));
输出:
Liverpool
检查删除结果
MongoDB shell 的删除方法会返回一个结果文档,其中包含 deletedCount,即删除的文档数量。例如,可以将结果赋值给变量,再通过 const result = db.teams.deleteMany({ team: "Manchester" }); result.deletedCount 查看数量。计数为 0 表示没有文档匹配筛选条件;计数大于 0 则表示实际删除的文档数量。对于 deleteOne(),计数最多为 1。
使用 deleteMany({}) 清空集合后,结果中的 deletedCount 会报告删除的文档数量。如果计数为 0,集合可能原本就是空的,也可能命令指向了错误的数据库或集合。重试前,请核对当前数据库和集合名称。这些检查有助于区分集合本来为空的正常结果与目标选错的情况,无需假定具体删除了哪一条文档。