Spec-Zone.ru › Mongoose

Типы схем

Типы схем обрабатывают определение значений по умолчанию путей, валидацию, получатели, установщики, значения по умолчанию для выбора полей для запросов и другие общие характеристики для строк и чисел. Подробнее см. соответствующую документацию API.

Ниже приведены все допустимые типы схем.

  • Строка
  • Число
  • Дата
  • Буфер
  • Булево
  • Смешанный
  • Objectid
  • Массив

Пример

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API