MongoDB CRUD 操作精通:实用的命令指南
MongoDB 是一种流行的 NoSQL 文档数据库,因其灵活性、可伸缩性和高性能而成为无数现代应用程序的基石。与任何数据库交互的核心是基本的创建、读取、更新和删除 (CRUD) 操作。掌握这些命令对于任何使用 MongoDB 的人来说都至关重要,无论是开发新功能还是管理数据的管理员。
本综合指南将引导您了解执行 CRUD 操作的核心 MongoDB 命令。我们将通过实用、易于理解的示例介绍 insert、find、update 和 delete 命令,使您能够高效地管理数据。阅读本文后,您将对如何有效地与 MongoDB 集合进行交互并充满信心。
先决条件
在深入了解命令之前,请确保您已:
- 安装并运行 MongoDB: 您可以从官方 MongoDB 网站下载,或使用 MongoDB Atlas 等云服务。
- 安装
mongosh(MongoDB Shell): 这是 MongoDB 的交互式 JavaScript 界面。
连接到 MongoDB 和选择数据库
首先,打开您的终端或命令提示符,并使用 mongosh 连接到您的 MongoDB 实例:
mongosh
连接后,您将进入默认的 test 数据库。要切换到或创建新数据库,请使用 use 命令:
use myDatabase;
如果 myDatabase 不存在,当您在此数据库的集合中插入第一个文档时,MongoDB 会隐式创建它。
创建操作 (Insert)
创建操作涉及向集合添加新文档。MongoDB 提供了插入单个或多个文档的方法。
1. db.collection.insertOne()
此方法将单个文档插入集合。如果集合不存在,MongoDB 会创建它。
// 选择一个名为 'users' 的集合
db.users.insertOne({
name: "Alice Smith",
age: 30,
city: "New York",
email: "[email protected]",
interests: ["reading", "hiking"]
});
输出将显示 acknowledged 状态和新文档的 insertedId。
2. db.collection.insertMany()
使用此方法一次将多个文档插入集合。它接受一个文档数组。
db.users.insertMany([
{
name: "Bob Johnson",
age: 24,
city: "Los Angeles",
email: "[email protected]",
interests: ["coding", "gaming"]
},
{
name: "Charlie Brown",
age: 35,
city: "New York",
email: "[email protected]",
interests: ["cooking", "photography"]
},
{
name: "Diana Prince",
age: 29,
city: "London",
email: "[email protected]",
interests: ["fitness", "travel"]
}
]);
这将返回所有添加文档的 insertedIds 数组。
提示: 如果您不提供
_id字段(一个唯一的 ObjectId),MongoDB 会自动为每个文档添加一个。
读取操作 (Find)
读取操作涉及从集合中查询文档。find() 方法是您的主要工具。
1. db.collection.find()
a. 查找所有文档
要检索集合中的所有文档,请在不带任何参数的情况下调用 find():
db.users.find();
b. 使用查询过滤器查找文档
将查询文档传递给 find() 以指定选择文档的标准。这在 SQL 中相当于 WHERE 子句。
// 查找纽约的用户
db.users.find({ city: "New York" });
// 查找年龄大于 25 岁的用户
db.users.find({ age: { $gt: 25 } });
// 查找年龄在 25 到 35 岁之间(不包括 35)的用户
db.users.find({ age: { $gt: 25, $lt: 35 } });
// 查找兴趣包括“coding”的用户
db.users.find({ interests: "coding" });
// 查找兴趣同时包括“reading”和“hiking”的用户
db.users.find({ interests: { $all: ["reading", "hiking"] } });
// 查找名字是 Alice Smith 或来自伦敦的用户
db.users.find({
$or: [
{ name: "Alice Smith" },
{ city: "London" }
]
});
常用查询运算符:
* $eq: 等于 (如果未指定运算符,则默认为此)
* $ne: 不等于
* $gt: 大于
* $gte: 大于或等于
* $lt: 小于
* $lte: 小于或等于
* $in: 匹配数组中指定值中的任何一个
* $nin: 不匹配数组中指定值中的任何一个
* $and, $or, $not, $nor: 逻辑运算符
c. 投影:选择特定字段
要仅返回字段的子集,请将投影文档作为 find() 的第二个参数传递。值为 1 表示包含字段,值为 0 表示排除字段。默认情况下包含 _id 字段,除非显式排除。
// 仅返回 name 和 email 字段,排除 _id
db.users.find({ city: "New York" }, { name: 1, email: 1, _id: 0 });
d. 排序、限制和跳过
链式调用方法允许更复杂的查询:
// 按年龄降序排序(1 表示升序,-1 表示降序)
db.users.find().sort({ age: -1 });
// 将结果限制为 2 个文档
db.users.find().limit(2);
// 跳过前 2 个文档并返回剩余文档
db.users.find().skip(2);
// 组合操作:查找纽约的用户,按年龄排序,跳过 1 条,限制 1 条
db.users.find({ city: "New York" }).sort({ age: 1 }).skip(1).limit(1);
2. db.collection.findOne()
此方法返回一个匹配查询条件的单个文档。如果多个文档匹配,它将返回找到的第一个文档。
db.users.findOne({ name: "Alice Smith" });
更新操作
更新操作会修改集合中现有的文档。您可以更新单个文档、多个文档,甚至替换整个文档。
1. db.collection.updateOne()
更新匹配筛选条件的单个文档。
// 将 Alice 的城市更新为“San Francisco”
db.users.updateOne(
{ name: "Alice Smith" },
{ $set: { city: "San Francisco", lastUpdated: new Date() } }
);
2. db.collection.updateMany()
更新所有匹配筛选条件的文档。
// 将纽约所有用户的年龄增加 1
db.users.updateMany(
{ city: "New York" },
{ $inc: { age: 1 } }
);
// 为不包含“reading”的用户添加新的兴趣“reading”
db.users.updateMany(
{}, // 应用于所有文档
{ $addToSet: { interests: "reading" } }
);
// 从 Bob Johnson 的兴趣列表中移除“gaming”
db.users.updateOne(
{ name: "Bob Johnson" },
{ $pull: { interests: "gaming" } }
);
常用更新运算符:
* $set: 设置文档中字段的值。如果字段不存在,则创建它。
* $inc: 将字段的值增加指定数量。
* $unset: 从文档中移除一个字段。
* $push: 将一个值添加到数组字段。
* $pull: 从数组中移除所有与指定查询匹配的值。
* $addToSet: 仅当值不存在时,才将一个值添加到数组。
3. db.collection.replaceOne()
用新文档替换匹配筛选条件的单个文档。被替换文档的 _id 字段无法更改。
// 完全替换 Bob Johnson 的文档
db.users.replaceOne(
{ name: "Bob Johnson" },
{
name: "Robert Johnson",
occupation: "Software Engineer",
status: "active",
email: "[email protected]"
}
);
Upsert 选项
updateOne() 和 updateMany() 都支持 upsert 选项。如果设置为 true,并且没有文档匹配筛选条件,MongoDB 将根据查询和更新操作插入一个新文档。
db.users.updateOne(
{ name: "David Lee" },
{ $set: { age: 28, city: "Seattle" } },
{ upsert: true } // 如果 David Lee 不存在,则创建他
);
删除操作
删除操作会从集合中删除文档。请极其谨慎地执行删除操作,因为它们是不可逆的。
1. db.collection.deleteOne()
删除最多一个匹配指定筛选条件的文档。
// 删除名为“Robert Johnson”(以前是“Bob Johnson”)的用户
db.users.deleteOne({ name: "Robert Johnson" });
2. db.collection.deleteMany()
删除所有匹配指定筛选条件的文档。
// 删除所有来自伦敦的用户
db.users.deleteMany({ city: "London" });
警告: 要删除集合中的所有文档,请使用空筛选条件
{}。请极其谨慎,因为此操作无法撤销:
javascript db.users.deleteMany({}); // 删除 'users' 集合中的所有文档
3. db.collection.drop()
此方法将整个集合(包括其所有文档和索引)永久地从数据库中删除。
db.users.drop(); // 删除整个 'users' 集合
警告: 删除集合是一项极具破坏性的操作。请确保在执行此命令之前拥有适当的备份或完全确定。
MongoDB CRUD 最佳实践
- 索引: 对于经常查询的字段,创建索引以显著加快读取操作的速度。
db.collection.createIndex({ fieldName: 1 })。 - 投影: 只检索您需要的数据。使用投影 (
{ field: 1 }) 可以减少网络带宽和内存使用。 - 批量操作: 在插入、更新或删除大量文档时,使用
insertMany()、updateMany()和deleteMany()而不是单个操作,以减少开销。 - 理解运算符: 熟悉 MongoDB 丰富的查询和更新运算符集。它们提供了强大的数据操作方式。
- 错误处理: 在生产应用程序中,始终为数据库操作实现健壮的错误处理。
- 模式设计: 虽然 MongoDB 是无模式的,但周密的模式设计对于高效的查询和数据一致性至关重要。
结论
掌握 MongoDB 的 CRUD 操作是有效数据管理和应用程序开发的基础。本指南通过实际示例和最佳实践,为您提供了对核心 insert、find、update 和 delete 命令的实用性概述。
通过了解如何创建、读取、更新和删除文档,您已经掌握了与 MongoDB 数据库高效交互的核心技能。请继续练习这些命令,并探索更高级的功能,如聚合管道、事务和索引策略,以进一步提升您的 MongoDB 专业知识。