Документы
Документы 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