Введение
В этой лабораторной работе вы научитесь создавать и управлять профилями пользователей в MongoDB. Вы начнете с проектирования базовой схемы, затем научитесь обновлять документы, работать с массивами для интересов пользователей и управлять сложными вложенными настройками. К концу этой лабораторной работы вы получите прочное понимание фундаментальных концепций моделирования данных MongoDB для создания гибких и масштабируемых профилей пользователей в ваших приложениях.
Создание базового профиля пользователя
На этом первом этапе вы создадите новую базу данных и вставите первый документ профиля пользователя. Это установит базовую структуру для хранения информации о пользователе.
Сначала откройте интерактивную оболочку MongoDB из вашего терминала. Это основной инструмент для взаимодействия с вашей базой данных MongoDB.
mongosh
Оказавшись внутри оболочки, вы увидите приглашение test>. Давайте переключимся на новую базу данных с именем userprofiles_db. Если база данных не существует, MongoDB создаст ее для вас при первом сохранении данных.
use userprofiles_db
Теперь вы вставите документ в коллекцию с именем profiles. Документ в MongoDB — это структура BSON (бинарный формат, похожий на JSON), а коллекция — это группа связанных документов.
Выполните следующую команду, чтобы вставить профиль для пользователя с именем 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" });
Вы должны увидеть документ, который вы только что вставили, вместе с уникальным полем _id, автоматически добавленным MongoDB. Дата и 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") для добавления поля last_updated в существующий объект metadata без его перезаписи. Это мощная функция для обновления вложенных полей.
Давайте снова получим документ, чтобы увидеть изменения.
db.profiles.find({ username: "johndoe" });
В выводе теперь будут показаны недавно добавленные contact_details и временная метка last_updated в metadata.
[
{
_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 эффективно обрабатывает это с помощью массивов. На этом шаге мы добавим и изменим массив интересов в нашем профиле пользователя.
Сначала давайте добавим массив interests в профиль johndoe, используя оператор $set.
db.profiles.updateOne(
{ username: "johndoe" },
{ $set: { interests: ["technology", "travel"] } }
);
Теперь предположим, что у пользователя появился новый интерес. Вместо того чтобы заменять весь массив, мы можем добавить в него новый элемент, используя оператор $push. Этот оператор добавляет указанное значение в конец массива и более эффективен для добавлений.
db.profiles.updateOne(
{ username: "johndoe" },
{ $push: { interests: "photography" } }
);
Давайте посмотрим обновленный профиль, чтобы увидеть новый интерес. Мы можем использовать проекцию в методе find, чтобы показать только поля 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 в профиле.
Сначала давайте добавим объект settings с вложенными полями для theme, language и notifications.
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 } }
);
Эта команда точно нацелена на поле sms внутри вложенного объекта notifications и изменяет его значение на 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, вы можете набрать exit или нажать Ctrl+D.
exit;
Резюме
В этой лаборатории вы изучили основы создания профилей пользователей в MongoDB. Вы начали с создания базового документа пользователя, а затем перешли к обновлению его новой информацией с помощью оператора $set. Вы также узнали, как управлять списками данных с помощью массивов и оператора $push, а также как структурировать и изменять сложные конфигурации с вложенными документами, используя точечную нотацию. Эти навыки необходимы для проектирования гибких и масштабируемых схем для любого приложения, которое управляет данными пользователей в MongoDB.

