Схема в Mongoose определяет метаданные модели - ее свойства, типы данных и ряд другой информации.
В прошлой теме схема определялась следующим образом:
const userScheme = new Schema({ name: String, age: Number });
В качестве типа данных можно указывать одно из следующих значений:
String
Number
Date
Buffer
Boolean
Mixed
Objectid
Array
Decimal128
Map
Если свойство представляет сложный объект, то в качестве типа указываем определение этого объекта:
const userScheme = new Schema({ name: String, age: Number, company: { name: String, employee: [String], // тип - массив строк date: Date } });
Подробнее про определение типов можно посмотреть по ссылке http://mongoosejs.com/docs/schematypes.html.
Но название свойств и их тип - это не все, что мы можем здесь определить.
С помощью параметра default мы можем указать значение по умолчанию для свойства. Например:
const userScheme = new Schema({ name: { type: String, default: "NoName" }, age: { type: Number, default: 22 } });
Создадим трех пользователей:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; // установка схемы const userScheme = new Schema({ name: { type: String, default: "NoName" }, age: { type: Number, default: 22 } }); const User = mongoose.model("User", userScheme); const user1 = new User(); // name - NoName, age - 22 const user2 = new User({name: "Tom"}); // name - Tom, age - 22 const user3 = new User({age:34}); // name - NoName, age - 34 console.log(user1); console.log(user2); console.log(user3);
Если у пользователя не определено свойство, то для него используется значение по умолчанию.
Mongoose имеет ряд встроенных правил валидации, которые мы можем указать в схеме:
required: требует обязательного наличия значения для свойства
min и max: задают минимальное и максимальное значения для числовых данных
minlength и maxlength: задают минимальную и максимальную длину для строк
enum: строка должна представлять одно из значений в указанном массиве строк
match: строка должна соответствовать регулярному выражению
Если мы попытаемся добавить некорректные данные в БД, то запрос на добавление вернет ошибку:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; // установка схемы const userScheme = new Schema({ name: { type: String, required: true, minlength:3, maxlength:20 }, age: { type: Number, required: true, min: 1, max:100 } }); const User = mongoose.model("User", userScheme); const user = new User({name: "Li"}); async function main() { await mongoose.connect("mongodb://127.0.0.1:27017/usersdb"); await user.save(); console.log("Сохранен объект", user); } main().catch(console.log).finally(async()=>await mongoose.disconnect());
При запуске на консоли мы увидим подробную информацию об ошибке:
По умолчанию при сохранении данных Mongoose добавляет специальное поле __v, которое указывает на версию документа. Например, сохраним в БД валидный объект:
const tom = new User({name: "Tom", age: 34}); await tom.save(); console.log(tom);
После сохранения приложение выведет на консоль объект в следующем виде:
{ name: 'Tom', age: 34, _id: new ObjectId("6377c7a46fa33e19ac7a7c41"), __v: 0 }
И в консольном выводе мы видим поле __v
. Но не всегда подобное поле необходимо, и его можно отключить, добавив в схему объект { versionKey: false }:
const userScheme = new Schema( {name: String, age: Number}, { versionKey: false } );