Типы схем
Типы схем обрабатывают определение значений по умолчанию путей, валидацию, получатели, установщики, значения по умолчанию для выбора полей для запросов и другие общие характеристики для строк и чисел. Подробнее см. соответствующую документацию API.
Ниже приведены все допустимые типы схем.
Пример
var schema = new Schema({ name: String, binary: Buffer, living: Boolean, updated: { type: Date, default: Date.now }, age: { type: Number, min: 18, max: 65 }, mixed: Schema.Types.Mixed, _someId: Schema.Types.ObjectId, array: [], ofString: [String], ofNumber: [Number], ofDates: [Date], ofBuffer: [Buffer], ofBoolean: [Boolean], ofMixed: [Schema.Types.Mixed], ofObjectId: [Schema.Types.ObjectId], ofArrays: [[]], ofArrayOfNumbers: [[Number]], nested: { stuff: { type: String, lowercase: true, trim: true } } }) // example use var Thing = mongoose.model('Thing', schema); var m = new Thing; m.name = 'Statue of Liberty'; m.age = 125; m.updated = new Date; m.binary = new Buffer(0); m.living = false; m.mixed = { any: { thing: 'i want' } }; m.markModified('mixed'); m._someId = new mongoose.Types.ObjectId; m.array.push(1); m.ofString.push("strings!"); m.ofNumber.unshift(1,2,3,4); m.ofDates.addToSet(new Date); m.ofBuffer.pop(); m.ofMixed = [1, [], 'three', { four: 5 }]; m.nested.stuff = 'good'; m.save(callback);
Параметры типа схемы
Вы можете объявить тип схемы, используя тип напрямую или объект со свойством type.
var schema1 = new Schema({ test: String // `test` is a path of type String }); var schema2 = new Schema({ test: { type: String } // `test` is a path of type string });
Помимо свойства type, вы можете указать дополнительные свойства для пути. Например, если вы хотите привести строку к нижнему регистру перед сохранением:
var schema2 = new Schema({ test: { type: String, lowercase: true // Always convert `test` to lowercase } });
Свойство lowercase работает только для строк. Существуют определенные параметры, которые применяются ко всем типам схем, и некоторые, которые применяются к определённым типам схем.
Все типы схем
-
required: boolean или функция, если true, добавляет обязательный валидатор для этого свойства -
default: Любое значение или функция, устанавливает значение по умолчанию для пути. Если значение является функцией, возвращаемое значение функции используется в качестве значения по умолчанию. -
select: boolean, определяет значения по умолчанию для проекций запросов -
validate: функция, добавляет функцию валидации для этого свойства -
get: функция, определяет пользовательский получатель для этого свойства с использованиемObject.defineProperty(). -
set: функция, определяет пользовательский установщик для этого свойства с использованиемObject.defineProperty(). -
alias: строка, только для mongoose >= 4.10.0. Определяет виртуальное свойство с заданным именем, которое получает/устанавливает этот путь.
var numberSchema = new Schema({ integerOnly: { type: Number, get: v => Math.round(v), set: v => Math.round(v), alias: 'i' } }); var Number = mongoose.model('Number', numberSchema); var doc = new Number(); doc.integerOnly = 2.001; doc.integerOnly; // 2 doc.i; // 2 doc.i = 3.001; doc.integerOnly; // 3 doc.i; // 3
Индексы
Вы также можете определить индексы MongoDB с помощью параметров типа схемы.
-
index: boolean, определяет, следует ли определять индекс на этом свойстве. -
unique: boolean, определяет, следует ли определять уникальный индекс на этом свойстве. -
sparse: boolean, определяет, следует ли определять разреженный индекс на этом свойстве.
var schema2 = new Schema({ test: { type: String, index: true, unique: true // Unique index. If you specify `unique: true` // specifying `index: true` is optional if you do `unique: true` } });
Строка
-
lowercase: boolean, всегда ли вызывать.toLowerCase()для значения -
uppercase: boolean, всегда ли вызывать.toUpperCase()для значения -
trim: boolean, всегда ли вызывать.trim()для значения -
match: RegExp, создаёт валидатор, проверяющий, соответствует ли значение заданному регулярному выражению -
enum: Массив, создаёт валидатор, проверяющий, содержится ли значение в заданном массиве.
Число
-
min: Число, создаёт валидатор, проверяющий, больше ли значение или равно заданному минимуму. -
max: Число, создаёт валидатор, проверяющий, меньше ли значение или равно заданному максимуму.
Дата
-
min: Дата -
max: Дата
Примечания к использованию:
Даты
Встроенные Date методы не подключены к логике отслеживания изменений mongoose, что означает, что если вы используете Date в своём документе и изменяете его методом, таким как setMonth(), mongoose не будет знать об этом изменении и doc.save() не сохранит это изменение. Если вам необходимо изменить Date типы, используя встроенные методы, сообщите mongoose об изменении с помощью doc.markModified('pathToYourDate') перед сохранением.
var Assignment = mongoose.model('Assignment', { dueDate: Date }); Assignment.findOne(function (err, doc) { doc.dueDate.setMonth(3); doc.save(callback); // THIS DOES NOT SAVE YOUR CHANGE doc.markModified('dueDate'); doc.save(callback); // works })
Смешанный
Тип схемы «любое значение», его гибкость имеет свою цену – сложность поддержания. Смешанный доступен через Schema.Types.Mixed или пустой литерал объекта. Следующие варианты эквивалентны:
var Any = new Schema({ any: {} }); var Any = new Schema({ any: Object }); var Any = new Schema({ any: Schema.Types.Mixed });
Поскольку это тип без схемы, вы можете изменить значение на что-либо ещё, но Mongoose теряет возможность автоматически определять и сохранять эти изменения. Чтобы «сообщить» Mongoose, что значение типа Mixed изменилось, вызовите метод .markModified(path) документа, передав путь к типу Mixed, который вы только что изменили.
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
ObjectId
Для указания типа ObjectId используйте Schema.Types.ObjectId в вашем объявлении.
var mongoose = require('mongoose'); var ObjectId = mongoose.Schema.Types.ObjectId; var Car = new Schema({ driver: ObjectId }); // or just Schema.ObjectId for backwards compatibility with v2
Массивы
Обеспечивает создание массивов типов схем или поддокументов.
var ToySchema = new Schema({ name: String }); var ToyBox = new Schema({ toys: [ToySchema], buffers: [Buffer], string: [String], numbers: [Number] // ... etc });
Примечание: указание пустого массива эквивалентно Mixed. Следующие варианты создают массивы Mixed.
var Empty1 = new Schema({ any: [] }); var Empty2 = new Schema({ any: Array }); var Empty3 = new Schema({ any: [Schema.Types.Mixed] }); var Empty4 = new Schema({ any: [{}] });
Массивы по умолчанию имеют значение `[]` (пустой массив).
var Toy = mongoose.model('Test', ToySchema); console.log((new Toy()).toys); // []
Чтобы переопределить этот параметр, необходимо установить значение по умолчанию в `undefined`.
var ToySchema = new Schema({ toys: { type: [ToySchema], default: undefined } });
Если массив помечен как «обязательный», он должен содержать хотя бы один элемент.
var ToySchema = new Schema({ toys: { type: [ToySchema], required: true } }); var Toy = mongoose.model('Toy', ToySchema); Toy.create({ toys: [] }, function(error) { console.log(error.errors['toys'].message); // Path "toys" is required. });
Создание пользовательских типов
Mongoose также может быть расширен с помощью пользовательских типов схем. Ищите на сайте плагины совместимые типы, такие как mongoose-long, mongoose-int32 и другие|типы.
Функция `schema.path()`
Функция schema.path() возвращает созданный тип схемы для заданного пути.
var sampleSchema = new Schema({ name: { type: String, required: true } }); console.log(sampleSchema.path('name')); // Output looks like: /** * SchemaString { * enumValues: [], * regExp: null, * path: 'name', * instance: 'String', * validators: ... */
Вы можете использовать эту функцию для проверки типа схемы для заданного пути, включая имеющиеся валидаторы и тип.
Далее
Теперь, когда мы разобрались с SchemaTypes, давайте перейдём к моделям.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/4.x/docs/schematypes.html