Определение схемы в Mongoose

Последнее обновление: 24.11.2023

Схема в 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 и Node.js

Версия документа

По умолчанию при сохранении данных 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 }
);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850