介绍
在本实验中,你将学习如何在 MongoDB 中创建和管理用户配置文件。你将从设计一个基础 schema 开始,然后学习如何更新文档、处理用户兴趣的数组,以及管理复杂的嵌套设置。完成本实验后,你将对构建灵活且可扩展的应用程序用户配置文件所需的基础 MongoDB 数据建模概念有扎实的理解。
创建基本用户配置文件
在第一步中,你将创建一个新数据库并插入你的第一个用户配置文件文档。这将建立存储用户信息的基石。
首先,从你的终端打开 MongoDB 交互式 shell。这是与你的 MongoDB 数据库交互的主要工具。
mongosh
进入 shell 后,你将看到一个 test> 提示符。让我们切换到一个名为 userprofiles_db 的新数据库。如果数据库不存在,MongoDB 会在你首次存储数据时为你创建它。
use userprofiles_db
现在,你将向一个名为 profiles 的集合中插入一个文档。在 MongoDB 中,文档是 BSON(类似 JSON 的二进制结构),而集合是相关文档的 agrupación。
执行以下命令插入一个名为 johndoe 的用户的配置文件。
db.profiles.insertOne({
username: "johndoe",
personal_info: {
first_name: "John",
last_name: "Doe",
email: "john.doe@example.com"
},
metadata: {
created_at: new Date(),
account_status: "active"
}
});
此命令使用 insertOne() 方法添加单个文档。该文档包含一个 username,一个嵌套的 personal_info 对象,以及一个用于跟踪创建时间和账户状态的 metadata 对象。
为了确认文档已成功创建,你可以使用 find() 方法检索它。
db.profiles.find({ username: "johndoe" });
你应该会看到你刚刚插入的文档,以及 MongoDB 自动添加的唯一 _id 字段。你输出中的日期和 ObjectId 将会有所不同。
[
{
_id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
username: 'johndoe',
personal_info: {
first_name: 'John',
last_name: 'Doe',
email: 'john.doe@example.com'
},
metadata: {
created_at: ISODate('2023-12-05T10:30:51.123Z'),
account_status: 'active'
}
}
]
添加和更新配置文件信息
在这一步中,你将学习如何修改现有文档。我们将为在上一步中创建的用户配置文件添加更详细的联系信息。
我们将使用 updateOne() 方法来更新 johndoe 的配置文件。此方法接受两个参数:一个用于查找要更新文档的过滤器,以及一个指定更改的更新文档。
让我们添加一个 contact_details 对象。我们将使用 $set 操作符,它会将字段的值替换为指定的值。如果字段不存在,$set 会添加一个新字段。
db.profiles.updateOne(
{ username: "johndoe" },
{
$set: {
contact_details: {
phone: "+1-555-1234",
address: {
street: "123 Main St",
city: "San Francisco",
country: "USA"
}
},
"metadata.last_updated": new Date()
}
}
);
在此命令中,我们添加了一个新的 contact_details 对象。我们还使用了点表示法("metadata.last_updated")在现有的 metadata 对象中添加了一个 last_updated 字段,而没有覆盖它。这是更新嵌套字段的一个强大功能。
让我们再次检索文档以查看更改。
db.profiles.find({ username: "johndoe" });
输出现在将显示新添加的 contact_details 和 metadata 中的 last_updated 时间戳。
[
{
_id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
username: 'johndoe',
personal_info: {
first_name: 'John',
last_name: 'Doe',
email: 'john.doe@example.com'
},
metadata: {
created_at: ISODate('2023-12-05T10:30:51.123Z'),
account_status: 'active',
last_updated: ISODate('2023-12-05T10:35:22.456Z')
},
contact_details: {
phone: '+1-555-1234',
address: {
street: '123 Main St',
city: 'San Francisco',
country: 'USA'
}
}
}
]
在配置文件中使用数组
用户配置文件通常包含项目列表,例如兴趣、技能或标签。MongoDB 使用数组高效地处理这些。在这一步中,你将在我们的用户配置文件中添加和修改一个兴趣数组。
首先,让我们使用 $set 操作符向 johndoe 的配置文件添加一个 interests 数组。
db.profiles.updateOne(
{ username: "johndoe" },
{ $set: { interests: ["technology", "travel"] } }
);
现在,假设用户产生了新的兴趣。我们不必替换整个数组,而是可以使用 $push 操作符向其中添加一个新元素。此操作符将指定值追加到数组末尾,对于添加操作更高效。
db.profiles.updateOne(
{ username: "johndoe" },
{ $push: { interests: "photography" } }
);
让我们查看更新后的配置文件以了解新的兴趣。我们可以在 find 方法中使用投影(projection)来仅显示 username 和 interests 字段。将字段设置为 1 会包含它,将 _id 设置为 0 会排除它,这能保持输出整洁。
db.profiles.find(
{ username: "johndoe" },
{ username: 1, interests: 1, _id: 0 }
);
输出将显示 interests 数组以及新添加的元素。
[
{
"username": "johndoe",
"interests": ["technology", "travel", "photography"]
}
]
你也可以根据用户数组中的元素来查询用户。例如,查找所有对“technology”感兴趣的用户:
db.profiles.find({ interests: "technology" });
管理复杂的嵌套数据
现实世界的应用程序通常需要存储复杂的配置,例如用户设置。MongoDB 对嵌套文档的支持非常适合这一点。在这一步中,你将在配置文件中添加和更新一个详细的 settings 对象。
首先,让我们添加一个包含 theme、language 和 notifications 嵌套字段的 settings 对象。
db.profiles.updateOne(
{ username: "johndoe" },
{
$set: {
settings: {
theme: "dark",
language: "en",
notifications: {
email: true,
sms: false
}
}
}
}
);
现在,让我们更新单个嵌套字段,而不重写整个 settings 对象。我们可以再次使用点表示法来完成此操作。让我们为用户启用 SMS 通知。
db.profiles.updateOne(
{ username: "johndoe" },
{ $set: { "settings.notifications.sms": true } }
);
此命令精确地定位了嵌套 notifications 对象中的 sms 字段,并将其值更改为 true,而不会影响 settings 对象的其余部分。
为了验证更改,让我们使用投影仅检索我们用户的 settings 对象。
db.profiles.find({ username: "johndoe" }, { settings: 1, _id: 0 });
输出将显示更新后的 settings 对象,其中 sms 现在设置为 true。
[
{
"settings": {
"theme": "dark",
"language": "en",
"notifications": { "email": true, "sms": true }
}
}
]
你现在已完成此实验的实际操作步骤。要退出 MongoDB shell,你可以输入 exit 或按 Ctrl+D。
exit;
总结
在此实验中,你学习了在 MongoDB 中构建用户配置文件的基础知识。你从创建基本用户文档开始,然后使用 $set 操作符更新其新信息。你还学习了如何使用数组和 $push 操作符管理数据列表,以及如何使用点表示法构建和修改复杂的嵌套配置。这些技能对于为任何管理 MongoDB 中用户数据的应用程序设计灵活且可扩展的模式至关重要。

