Статьи

Что нового в Mongoose 3.8.9

У меня есть важное объявление: за последние пару недель я занялся поддержкой mongoose , популярного ODM MongoDB / NodeJS. У меня есть кое-какие большие ботинки, Аарон Хекманн проделал необычайную работу по созданию мангуста в неотъемлемой части экосистемы NodeJS. Будучи заядлым пользователем mongoose в течение последних двух лет, я с нетерпением жду продолжения легендарной традиции mongoose — делать обработку данных элегантной и увлекательной. Тем не менее, mongoose не идеален, и я уже с нетерпением жду следующей основной стабильной версии 4.0.0. Предложения приветствуются, но, пожалуйста, наберитесь терпения, я все еще пытаюсь наверстать упущенное в проблемах и выдвигать запросы.

На что нового в 3.8.9

На этой ноте Mongoose 3.8.9 был (наконец) выпущен недавно. В первую очередь это был технический выпуск, основным приоритетом которого было устранение нескольких неудачных тестов в новой стабильной версии сервера MongoDB 2.6.x без каких-либо изменений API. Я с гордостью могу сказать, что 3.8.9 должен быть совместим с MongoDB 2.2.x, 2.4.x и 2.6.x. Кроме того, я добавил улучшенную поддержку нескольких ключевых функций MongoDB 2.6:

Поддержка текстового поиска в MongoDB 2.6.x

Как я упоминал в своем посте о текстовом поиске , mongoose 3.8.8 еще не полностью поддерживал текстовый поиск: mongoose не позволял вам сортировать по тексту. Этот коммит , который вошел в mquery 0.6.0, позволяет вам использовать новый оператор $ meta в вызовах sort () . Вот пример того, как вы будете использовать поиск текста с сортировкой в ​​мангусте:

/* Blog post collection with two documents:
 * { title : 'text search in mongoose' }
 * { title : 'searching in mongoose' }
 * and a text index on the 'title' field */
BlogPost.
  find(
    { $text : { $search : 'text search' } },
    { score : { $meta: "textScore" } }
  ).
  sort({ score : { $meta : 'textScore' } }).
  limit(2).
  exec(function(error, documents) {
    assert.ifError(error);
    assert.equal(2, documents.length);
    assert.equal('text search in mongoose', documents[0].title);
    assert.equal('searching in mongoose', documents[1].title);
    db.close();
    done();
  });

Соответствующий тестовый пример можно найти здесь (также есть тестовое покрытие для текстового поиска без сортировки). Обратите внимание, что вы несете ответственность за то, чтобы убедиться, что вы запускаете> = MongoDB 2.6.0, выполнение текстовых запросов к более старым версиям MongoDB не даст ожидаемого поведения. Документы MongoDB о текстовом поиске можно найти здесь .

Помощник по агрегации за $ out:

Как я упоминал в своем посте о стадии конвейера $ out структуры агрегации (которая направляет вывод агрегации в коллекцию), функция aggregate () mongoose не мешает вам использовать $ out. Однако mongoose также поддерживает синтаксический сахар для объединения вспомогательных функций в aggregate () для построения конвейера агрегации:

MyModel.aggregate()
  .group(group.$group)
  .project(project.$project)
  .exec(function (err, res) {
  });

Этот коммит добавляет вспомогательную функцию .out (), которую вы можете использовать для добавления стадии $ out в ваш конвейер. Обратите внимание, что вы несете ответственность за то, чтобы функция .out () была последней стадией вашего конвейера, потому что сервер MongoDB вернет ошибку, если это не так. Соответствующий тестовый пример можно найти здесь . Вот как выглядит новая вспомогательная функция в действии:

var outputCollection = 'my_output_collection';
 
MyModel.aggregate()
  .group(group.$group)
  .project(project.$project)
  .out(outputCollection)
  .exec(function(error, result) {
  });

Небольшая оговорка о совместимости с 2.6.x

В 3.8.9 остается еще один неудачный крайний случай, который влияет только на MongoDB 2.6.x. К сожалению, MongoDB 2.6.x больше не позволяет передавать пустые операторы $ set в update () и findAndModify () . Это изменение влияет только на мангуста в том случае, если для флага upsert установлено значение true. Этот коммит пытается смягчить эту несогласованность API, но есть еще один случай, когда вы получите ошибку в MongoDB 2.6.x, но не в 2.4.x: если запрос, передаваемый в findAndModify (), содержит только поле _id . Например,

MyModel.findOneAndUpdate(
  { _id: 'MY_ID' },
  {},
  { upsert: true },
  function(error, document) {
  });

Вернет ошибку сервера на MongoDB 2.6.1, но не 2.4.10. В настоящее время нет хорошего способа справиться с этим случаем как в 2.4, так и в 2.6, не выполняя оператор if в версии или не нарушая существующий API. Вы можете отслеживать прогресс этого вопроса на Github .

Вывод

Надеюсь, вы так же взволнованы будущим Мангуста, как и я. Есть много интересных идей, которые я с нетерпением жду, чтобы попасть в Мангуст 4.0. Мы с радостью добавляем предложения по новым функциям или изменениям поведения в Github . Я с нетерпением жду встречи с тем, что вы можете придумать для улучшения мангуста, и что вы сможете сделать с будущими версиями.