Spec-Zone.ru › Mongoose

Запросы

Документы могут быть извлечены с помощью нескольких статических вспомогательных методов моделей.

Любой метод модели, который включает указание условий запроса условий может быть выполнен двумя способами:

Когда функция 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

Spec-Zone.ru

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