Запросы
Документы могут быть извлечены с помощью нескольких статических вспомогательных методов моделей.
Любой метод модели, который включает указание условий запроса условий может быть выполнен двумя способами:
Когда функция callback:
- передаётся, операция будет выполнена немедленно, а результаты переданы в обратный вызов.
- не передаётся, возвращается экземпляр Query, который предоставляет специальный интерфейс для построения запросов.
В mongoose 4, у Query есть функция .then(), и, следовательно, может быть использована как обещание.
При выполнении запроса с функцией callback, вы указываете свой запрос как JSON-документ. Синтаксис JSON-документа такой же, как и в оболочке MongoDB.
var Person = mongoose.model('Person', yourSchema); // find each person with a last name matching 'Ghost', selecting the `name` and `occupation` fields Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) { if (err) return handleError(err); console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) // Space Ghost is a talk show host. })
Здесь мы видим, что запрос был выполнен немедленно, а результаты переданы нашему обратному вызову. Все обратные вызовы в Mongoose используют шаблон: callback(error, result). Если при выполнении запроса произошла ошибка, параметр error будет содержать документ с ошибкой, а result будет равен null. Если запрос выполнен успешно, параметр error будет равен null, а result будет заполнен результатами запроса.
В любом месте, где в Mongoose передаётся обратный вызов запросу, обратный вызов следует шаблону callback(error, results). Что представляет собой results зависит от операции: Для findOne() это потенциально нулевой отдельный документ, find() список документов, count() количество документов, update() количество затронутых документов и т.д. Более подробную информацию о том, что передаётся в обратные вызовы, можно найти в документации API для моделей.
Теперь давайте посмотрим, что происходит, когда не передаётся callback:
// find each person with a last name matching 'Ghost' var query = Person.findOne({ 'name.last': 'Ghost' }); // selecting the `name` and `occupation` fields query.select('name occupation'); // execute the query at a later time query.exec(function (err, person) { if (err) return handleError(err); console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) // Space Ghost is a talk show host. })
В приведенном выше коде переменная query имеет тип Query. Объект Query позволяет создавать запрос с использованием цепочечного синтаксиса вместо указания JSON-объекта. Ниже приведены 2 эквивалентных примера.
// With a JSON doc Person. find({ occupation: /host/, 'name.last': 'Ghost', age: { $gt: 17, $lt: 66 }, likes: { $in: ['vaporizing', 'talking'] } }). limit(10). sort({ occupation: -1 }). select({ name: 1, occupation: 1 }). exec(callback); // Using query builder Person. find({ occupation: /host/ }). where('name.last').equals('Ghost'). where('age').gt(17).lt(66). where('likes').in(['vaporizing', 'talking']). limit(10). sort('-occupation'). select('name occupation'). exec(callback);
Полный список вспомогательных функций Query можно найти в документации API.
Сеттеры по умолчанию не выполняются в 4.x. Например, если вы преобразуете электронные адреса в нижний регистр в своей схеме:
var personSchema = new Schema({ email: { type: String, lowercase: true } });
Mongoose не будет автоматически преобразовывать электронный адрес в нижний регистр в запросах, поэтому Person.find({ email: 'Val@karpov.io' }) не вернёт результатов. Используйте опцию runSettersOnQuery чтобы включить это поведение:
var personSchema = new Schema({ email: { type: String, lowercase: true } }, { runSettersOnQuery: true });
Ссылки на другие документы
В MongoDB нет объединений, но иногда нам всё же нужны ссылки на документы в других коллекциях. Именно здесь и появляется популяция. Подробнее о том, как включать документы из других коллекций в результаты запроса, читайте здесь.
Потоковая обработка
Вы можете потоково обрабатывать результаты запросов из MongoDB. Вам нужно вызвать функцию Query#cursor() вместо Query#exec, чтобы вернуть экземпляр QueryCursor.
var cursor = Person.find({ occupation: /host/ }).cursor(); cursor.on('data', function(doc) { // Called once for every document }); cursor.on('close', function() { // Called when done });
Далее
Теперь, когда мы рассмотрели Queries, давайте посмотрим на валидацию.
© 2010 LearnBoost
Licensed under the MIT License.
https://mongoosejs.com/docs/4.x/docs/queries.html