Spec-Zone.ru › Mongoose

Документы

Документы Mongoose документов представляют собой взаимно однозначное отображение документов, хранящихся в MongoDB. Каждый документ является экземпляром своего модели.

Документы и модели

Документ и Модель — это отдельные классы в Mongoose. Класс Model является подклассом класса Document. При использовании конструктора модели, вы создаете новый документ.

const MyModel = mongoose.model('Test', new Schema({ name: String }));
const doc = new MyModel();

doc instanceof MyModel; // true
doc instanceof mongoose.Model; // true
doc instanceof mongoose.Document; // true

В Mongoose «документ» обычно означает экземпляр модели. Вам не нужно создавать экземпляр класса Document без прохождения через модель.

Получение

При загрузке документов из MongoDB с помощью функций модели, таких как findOne(), вы получаете документ Mongoose.

const doc = await MyModel.findOne();

doc instanceof MyModel; // true
doc instanceof mongoose.Model; // true
doc instanceof mongoose.Document; // true

Обновление с помощью save()

Документы Mongoose отслеживают изменения. Вы можете изменить документ с помощью стандартных присваиваний JavaScript, и Mongoose преобразует его в операторы обновления MongoDB.

doc.name = 'foo';

// Mongoose sends an `updateOne({ _id: doc._id }, { $set: { name: 'foo' } })`
// to MongoDB.
await doc.save();

Метод save() возвращает промис. Если save() успешно, промис разрешается документом, который был сохранён.

doc.save().then(savedDoc => {
  savedDoc === doc; // true
});

Если документ с соответствующим _id не найден, Mongoose сообщит об ошибке DocumentNotFoundError:

const doc = await MyModel.findOne();

// Delete the document so Mongoose won't be able to save changes
await MyModel.deleteOne({ _id: doc._id });

doc.name = 'foo';
await doc.save(); // Throws DocumentNotFoundError

Обновление с помощью запросов

Функция save() — это обычно правильный способ обновления документа с помощью Mongoose. С save(), вы получаете полную валидацию и средства промежуточного кода.

В тех случаях, когда save() недостаточно гибко, Mongoose позволяет создавать собственные обновления MongoDB с приведением типов, средствами промежуточного кода и ограниченной валидацией.

// Update all documents in the `mymodels` collection
await MyModel.updateMany({}, { $set: { name: 'foo' } });

Обратите внимание, что update(), updateMany(), findOneAndUpdate(), и т. д. не выполняют save() средства промежуточного кода. Если вам нужны средства промежуточного кода сохранения и полная валидация, сначала выполните запрос на документ, а затем save() его.

Валидация

Документы приводятся к соответствующему типу и валидируются перед сохранением. Mongoose сначала приводит значения к указанному типу, а затем проверяет их. Внутренне Mongoose вызывает метод validate() документа перед сохранением.

const schema = new Schema({ name: String, age: { type: Number, min: 0 } });
const Person = mongoose.model('Person', schema);

const p = new Person({ name: 'foo', age: 'bar' });
// Cast to Number failed for value "bar" at path "age"
await p.validate();

const p2 = new Person({ name: 'foo', age: -1 });
// Path `age` (-1) is less than minimum allowed value (0).
await p2.validate();

Mongoose также поддерживает ограниченную валидацию при обновлениях с помощью опции runValidators. Mongoose приводит параметры к функциям запроса, таким как findOne(), updateOne() по умолчанию. Однако Mongoose не выполняет валидацию параметров функций запроса по умолчанию. Вам нужно установить runValidators: true для того, чтобы Mongoose проверил валидацию.

// Cast to number failed for value "bar" at path "age"
await Person.updateOne({}, { age: 'bar' });

// Path `age` (-1) is less than minimum allowed value (0).
await Person.updateOne({}, { age: -1 }, { runValidators: true });

Подробнее см. руководство по валидации.

Перезапись

Существует 2 способа перезаписи документа (замена всех ключей в документе). Один способ — использовать функцию Document#overwrite() за которым следует save().

const doc = await Person.findOne({ _id });

// Sets `name` and unsets all other properties
doc.overwrite({ name: 'Jean-Luc Picard' });
await doc.save();

Другой способ — использовать Model.replaceOne().

// Sets `name` and unsets all other properties
await Person.replaceOne({ _id }, { name: 'Jean-Luc Picard' });

Далее

Теперь, когда мы рассмотрели документы, давайте посмотрим на Поддокументы.

© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/documents.html

Spec-Zone.ru

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