Skip to content

MongoDB - 删除文档

本章涵盖了从 MongoDB 集合中删除文档的现代推荐方法:deleteOne() 和 deleteMany()。旧的 remove() 方法现已弃用,在新应用程序中应避免使用。

使用 deleteOne() 删除最多一个匹配指定过滤器的文档,即使有多个文档匹配。它将删除找到的 第一个 匹配文档。

db.COLLECTION_NAME.deleteOne(<filter>, <options>)

考虑一个 shoppingCart 集合。让我们删除用户的一个特定商品,“苹果”。

// 示例数据:
db.shoppingCart.insertMany([
{ userId: "user123", item: "apples", quantity: 2 },
{ userId: "user123", item: "bread", quantity: 1 },
{ userId: "user456", item: "apples", quantity: 3 }
]);
// 删除 'user123' 的 'apples' 文档
db.shoppingCart.deleteOne({ userId: "user123", item: "apples" });

此操作返回一个确认结果的文档:

{
"acknowledged": true,
"deletedCount": 1
}

如果没有文档匹配过滤器,deletedCount 将为 0。

使用 deleteMany() 删除所有匹配指定过滤器的文档。

db.COLLECTION_NAME.deleteMany(<filter>, <options>)

假设我们要清除 ‘user123’ 的整个购物车。

// 删除 'user123' 的所有文档
db.shoppingCart.deleteMany({ userId: "user123" });
// 结果:
{
"acknowledged": true,
"deletedCount": 2 // 'apples' 和 'bread' 都被删除了
}

安全最佳实践:空过滤器的危险

Section titled “安全最佳实践:空过滤器的危险”

向 deleteMany() 传递一个空过滤器文档 {} 将删除集合中的 所有 文档。这是一个破坏性且通常不可逆的操作。

// 危险:这将删除 shoppingCart 集合中的所有文档!
db.shoppingCart.deleteMany({});

在执行 deleteMany 命令之前,请务必仔细检查您的过滤器。如果您的目标是删除整个集合及其索引,使用 db.collection.drop() 更高效。

db.collection.remove() 方法自 MongoDB v3.2 起已弃用。现代驱动程序和 mongo Shell 如果您使用它会发出警告。您应该更新任何现有代码以使用 deleteOne() 或 deleteMany(),以提高清晰度并与现代最佳实践保持一致。