精通 MongoDB CRUD 操作:实用命令指南

使用这份关于基本 CRUD 操作的实用命令指南,释放 MongoDB 的强大功能。学习如何使用 `insert`、`find`、`update` 和 `delete` 命令高效地管理数据。本文提供了清晰的解释、真实的案例和最佳实践,用于在您的 MongoDB 集合中创建、读取、更新和删除文档。它是开发人员和管理员的理想选择,助您掌握 MongoDB 数据操作。

34 浏览量

MongoDB CRUD 操作精通:实用的命令指南

MongoDB 是一种流行的 NoSQL 文档数据库,因其灵活性、可伸缩性和高性能而成为无数现代应用程序的基石。与任何数据库交互的核心是基本的创建、读取、更新和删除 (CRUD) 操作。掌握这些命令对于任何使用 MongoDB 的人来说都至关重要,无论是开发新功能还是管理数据的管理员。

本综合指南将引导您了解执行 CRUD 操作的核心 MongoDB 命令。我们将通过实用、易于理解的示例介绍 insertfindupdatedelete 命令,使您能够高效地管理数据。阅读本文后,您将对如何有效地与 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 操作是有效数据管理和应用程序开发的基础。本指南通过实际示例和最佳实践,为您提供了对核心 insertfindupdatedelete 命令的实用性概述。

通过了解如何创建、读取、更新和删除文档,您已经掌握了与 MongoDB 数据库高效交互的核心技能。请继续练习这些命令,并探索更高级的功能,如聚合管道、事务和索引策略,以进一步提升您的 MongoDB 专业知识。