Введение
В этой лабораторной работе вы изучите основы валидации данных в MongoDB. Валидация данных — это важная функция, которая помогает поддерживать целостность и согласованность ваших данных, гарантируя, что все документы в коллекции соответствуют определенной структуре и правилам. Вы научитесь создавать коллекции с правилами валидации, тестировать эти правила, пытаясь вставлять как допустимые, так и недопустимые данные, а также изменять правила валидации для существующей коллекции. К концу этой лабораторной работы вы сможете обеспечивать качество данных непосредственно в вашей базе данных MongoDB.
Создание коллекции с валидацией схемы
На первом этапе вы подключитесь к серверу MongoDB и создадите новую коллекцию с определенными правилами валидации. Эти правила будут определять ожидаемые типы данных и ограничения для полей в ваших документах.
Сначала откройте MongoDB Shell (mongosh), чтобы взаимодействовать с вашей базой данных. Эта интерактивная оболочка является вашим основным инструментом для управления MongoDB.
mongosh
Оказавшись внутри оболочки, вы увидите приглашение, похожее на test>. Это означает, что вы подключены к базе данных test по умолчанию. Давайте создадим и переключимся на новую базу данных с именем dataValidationLab.
use dataValidationLab
Теперь давайте создадим коллекцию users. При создании коллекции мы включим документ validator, который использует $jsonSchema для определения наших правил.
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "age", "email"],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
age: {
bsonType: "int",
minimum: 18,
description: "must be an integer >= 18 and is required"
},
email: {
bsonType: "string",
pattern: "^.+@.+$",
description: "must be a valid email address and is required"
}
}
}
}
});
После выполнения команды вы должны увидеть вывод, указывающий на успех:
{ "ok": 1 }
Давайте разберем валидатор:
bsonType: "object": Корень документа должен быть объектом.required: ["name", "age", "email"]: Поляname,ageиemailдолжны присутствовать в каждом документе.properties: Этот объект определяет правила для отдельных полей.name: Должен бытьstring.age: Должен бытьint(целым числом) с минимальным значением 18.email: Должен бытьstring, соответствующий регулярному выражениюpattern, которое проверяет базовый формат электронной почты.
Теперь вы успешно создали коллекцию с правилами валидации данных. На следующем шаге вы протестируете эти правила.
Тестирование валидации путем вставки документов
Теперь, когда ваша коллекция users имеет правила валидации, давайте протестируем их. Вы попытаетесь вставить несколько документов: некоторые, нарушающие правила, и один, соответствующий им. Это поможет вам понять, как MongoDB применяет схему.
Сначала давайте попробуем вставить документ с некорректным типом данных для поля age. Мы предоставим строку "25" вместо целого числа.
db.users.insertOne({
name: "John Doe",
age: "25",
email: "john.doe@example.com"
});
Эта операция завершится неудачно. MongoDB отклонит документ и вернет WriteError, поскольку поле age не соответствует требованию bsonType: "int". Сообщение об ошибке будет содержать подробности о сбое валидации.
MongoServerError: Document failed validation
Далее, давайте попробуем вставить документ, в котором отсутствует обязательное поле email.
db.users.insertOne({
name: "Jane Doe",
age: 30
});
Это также завершится неудачно, поскольку поле email указано в массиве required в нашем валидаторе. Вы получите аналогичную ошибку WriteCommandError.
Наконец, давайте вставим документ, который соответствует всем правилам. name и email являются строками, а age — целым числом больше или равным 18.
db.users.insertOne({
name: "Alice",
age: 28,
email: "alice@example.com"
});
На этот раз команда будет успешной, и вы увидите подтверждающее сообщение с _id вновь вставленного документа.
{
"acknowledged": true,
"insertedId": ObjectId("...")
}
Чтобы убедиться, что допустимый документ был добавлен, вы можете выполнить запрос к коллекции.
db.users.find();
В выводе будет показан один документ, который успешно прошел валидацию.
[
{
"_id": ObjectId("..."),
"name": "Alice",
"age": 28,
"email": "alice@example.com"
}
]
Изменение существующего валидатора
Требования вашего приложения могут меняться со временем, и вам может потребоваться обновить правила валидации. На этом этапе вы узнаете, как изменить валидатор существующей коллекции с помощью команды collMod, а затем протестировать новые правила.
Предположим, мы хотим добавить новое поле status в нашу коллекцию users. Это поле должно быть строкой и может принимать только одно из двух значений: "active" или "inactive".
Мы используем команду collMod (collection modify) для применения нового валидатора.
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "age", "email", "status"],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
age: {
bsonType: "int",
minimum: 18,
description: "must be an integer >= 18 and is required"
},
email: {
bsonType: "string",
pattern: "^.+@.+$",
description: "must be a valid email address and is required"
},
status: {
enum: ["active", "inactive"],
description: "can only be one of the enum values and is required"
}
}
}
}
});
Команда вернет { "ok": 1 } в случае успеха. Теперь мы обновили валидатор, чтобы требовать поле status и ограничивать его значение с помощью ключевого слова enum.
Теперь давайте протестируем новое правило. Попробуйте вставить документ с недопустимым статусом.
db.users.insertOne({
name: "Bob",
age: 45,
email: "bob@example.com",
status: "pending"
});
Это завершится неудачно, поскольку "pending" отсутствует в списке enum для поля status. Далее, вставьте документ, который соответствует обновленным правилам.
db.users.insertOne({
name: "Bob",
age: 45,
email: "bob@example.com",
status: "active"
});
Эта вставка будет успешной. Чтобы увидеть все документы в вашей коллекции, снова выполните find().
db.users.find();
Теперь вы увидите документы как Алисы, так и Боба. Обратите внимание, что документ Алисы, вставленный до изменения правила, не имеет поля status. По умолчанию валидация не применяется к существующим документам до тех пор, пока они не будут изменены.
Резюме
В этой лабораторной работе вы изучили основные методы реализации валидации данных в MongoDB. Вы начали с создания коллекции с валидатором $jsonSchema для обеспечения типов данных, обязательных полей и ограничений значений. Затем вы протестировали эти правила, пытаясь вставить как недопустимые, так и допустимые документы, наблюдая, как MongoDB отклоняет данные, не соответствующие схеме. Наконец, вы узнали, как изменять правила валидации для существующей коллекции с помощью команды collMod для адаптации к новым требованиям. Эти навыки являются основополагающими для создания надежных приложений и поддержания высокого качества данных в ваших базах данных MongoDB.

