Модели
Модели — это расширенные конструкторы, скомпилированные из Schema определений. Экземпляр модели называется документом. Модели отвечают за создание и чтение документов из базы данных MongoDB.
Компиляция первой модели
При вызове mongoose.model() для схемы Mongoose компилирует для вас модель.
const schema = new mongoose.Schema({ name: String, size: String });
const Tank = mongoose.model('Tank', schema);
Первый аргумент — единственное имя коллекции, для которой предназначена модель. Mongoose автоматически ищет множественное число, в нижнем регистре имени вашей модели. Таким образом, для примера выше, модель Tank предназначена для коллекции tanks в базе данных.
Примечание: Функция .model() создает копию schema. Убедитесь, что вы добавили все необходимое в schema, включая хуки, перед вызовом .model()!
Создание документов
Экземпляр модели называется документом. Их создание и сохранение в базе данных очень просто.
const Tank = mongoose.model('Tank', yourSchema);
const small = new Tank({ size: 'small' });
await small.save();
// or
await Tank.create({ size: 'small' });
// or, for inserting large batches of documents
await Tank.insertMany([{ size: 'small' }]);
Обратите внимание, что никакие танки не будут созданы/удалены до тех пор, пока соединение, используемое вашей моделью, не будет открыто. Каждая модель имеет связанное соединение. Когда вы используете mongoose.model(), ваша модель будет использовать стандартное соединение mongoose.
await mongoose.connect('mongodb://127.0.0.1/gettingstarted');
Если вы создали пользовательское соединение, используйте функцию model() этого соединения вместо.
const connection = mongoose.createConnection('mongodb://127.0.0.1:27017/test');
const Tank = connection.model('Tank', yourSchema);
Запросы
Поиск документов с Mongoose прост, он поддерживает богатый синтаксис запросов MongoDB. Документы могут быть извлечены с помощью статических функций find, findById, findOne или where модели.
await Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec();
Дополнительные сведения о том, как использовать API Query, см. в главе о запросах.
Удаление
Модели имеют статические функции deleteOne() и deleteMany() для удаления всех документов, соответствующих заданному filter.
await Tank.deleteOne({ size: 'large' });
Обновление
У каждой model есть свой метод update для изменения документов в базе данных без возврата их в ваше приложение. Дополнительные сведения см. в документации API.
// Updated at most one doc, `res.nModified` contains the number
// of docs that MongoDB updated
await Tank.updateOne({ size: 'large' }, { name: 'T-90' });
Если вы хотите обновить один документ в базе данных и вернуть его в ваше приложение, используйте findOneAndUpdate вместо этого.
Потоки изменений
Потоки изменений предоставляют способ прослушивания всех вставок и обновлений, проходящих через вашу базу данных MongoDB. Обратите внимание, что потоки изменений не работают, если вы не подключены к реплицированной базе данных MongoDB.
async function run() {
// Create a new mongoose model
const personSchema = new mongoose.Schema({
name: String
});
const Person = mongoose.model('Person', personSchema);
// Create a change stream. The 'change' event gets emitted when there's a
// change in the database
Person.watch().
on('change', data => console.log(new Date(), data));
// Insert a doc, will trigger the change stream handler above
console.log(new Date(), 'Inserting doc');
await Person.create({ name: 'Axl Rose' });
}
Вывод из приведенной выше асинхронной функции будет выглядеть так, как показано ниже.
2018-05-11T15:05:35.467Z 'Inserting doc'
2018-05-11T15:05:35.487Z 'Inserted doc'
2018-05-11T15:05:35.491Z { _id: { _data: ... },
operationType: 'insert',
fullDocument: { _id: 5af5b13fe526027666c6bf83, name: 'Axl Rose', __v: 0 },
ns: { db: 'test', coll: 'Person' },
documentKey: { _id: 5af5b13fe526027666c6bf83 } }
Подробнее о потоках изменений в mongoose вы можете прочитать в этой статье блога.
Просмотры
Просмотры MongoDB — это по сути, только для чтения коллекции, содержащие данные, вычисленные из других коллекций с использованием агрегаций. В Mongoose для каждого из ваших Просмотров следует определить отдельную модель. Вы также можете создать Просмотр с помощью createCollection().
В следующем примере показано, как создать новый RedactedUser Просмотр модели User, который скрывает потенциально конфиденциальную информацию, такую как имя и адрес электронной почты.
// Make sure to disable `autoCreate` and `autoIndex` for Views,
// because you want to create the collection manually.
const userSchema = new Schema({
name: String,
email: String,
roles: [String]
}, { autoCreate: false, autoIndex: false });
const User = mongoose.model('User', userSchema);
const RedactedUser = mongoose.model('RedactedUser', userSchema);
// First, create the User model's underlying collection...
await User.createCollection();
// Then create the `RedactedUser` model's underlying collection
// as a View.
await RedactedUser.createCollection({
viewOn: 'users', // Set `viewOn` to the collection name, **not** model name.
pipeline: [
{
$set: {
name: { $concat: [{ $substr: ['$name', 0, 3] }, '...'] },
email: { $concat: [{ $substr: ['$email', 0, 3] }, '...'] }
}
}
]
});
await User.create([
{ name: 'John Smith', email: 'john.smith@gmail.com', roles: ['user'] },
{ name: 'Bill James', email: 'bill@acme.co', roles: ['user', 'admin'] }
]);
// [{ _id: ..., name: 'Bil...', email: 'bil...', roles: ['user', 'admin'] }]
console.log(await RedactedUser.find({ roles: 'admin' }));
Обратите внимание, что Mongoose не в настоящее время требует, чтобы Просмотры были только для чтения. Если вы попытаетесь save() документ из Просмотра, вы получите ошибку от сервера MongoDB.
Ещё
В документации API описаны многие дополнительные методы, такие как count, mapReduce, aggregate и другие.
Далее
Теперь, когда мы рассмотрели Models, давайте посмотрим на Документы.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/models.html