Как я могу просмотреть план выполнения запроса mongoose.js

Я хочу проверить, что запрос mongoose, который я создаю, использует мои индексы. Есть ли способ, которым я могу просмотреть окончательный запрос, сгенерированный для mongodb, чтобы я мог запустить .explain() в запросе?

Я могу догадаться, какой запрос он генерирует, но просто хотел проверить.

например.

 var query = Post.find()
   .regex('lowerCaseTitle', searchRegEx)
   .$gte('status',0)
   .$lt('start', now)
   .$gt('end',now)
   .sort('total', -1)
   .limit(50);

Ответ 1

Один из способов - использовать профилировщик mongodb и настроить его для регистрации всех операций:

http://www.mongodb.org/display/DOCS/Database+Profiler

Я не уверен, есть ли более простой способ сделать это через сам мангуст, но это было бы хорошо.

Обновление: добавив к тому, что сказал Дэн в другом ответе на ответ, вы должны включить профилировщик, чтобы получить то, что хотите, и отменить его. Оставляя его как "регистрировать все операции", безусловно, хороший способ замедлить работу вашей системы. Ограничение его на среду разработки также является хорошей идеей.

Ответ 2

Вы можете получить запрос выполнения с помощью опции debug on mongoose:

mongoose.set('debug', true);

или

mongoose.set('debug', function (collectionName, method, query, doc, options) {
  //
});

Ответ 3

Вы также можете использовать Query.prototype.explain() напрямую (как Mongoose 5.2.13)

 var query = Post.find()
   .regex('lowerCaseTitle', searchRegEx)
   .$gte('status',0)
   .$lt('start', now)
   .$gt('end',now)
   .sort('total', -1)
   .limit(50);
query.explain().then(console.log);

Ответ 4

Другой вариант:

model
  .find()
  .{{...}} // any thing else
  .setOptions({explain: 'executionStats'})
  .exec((e, explainObj)=>{
     ...
  })

Ответ 5

Самый простой способ - просто реплицировать этот запрос в оболочке MongoDB. Что-то вроде:

> var now = new Date();
> db.post.find({lowerCaseTitle: /your_regex_here/, status: {$gte: 0}, start: {$lt: now}, end: {$gt: now}}).sort({total: -1}).limit(50)

Это должно возвращать те же результаты, что и в запросе в mongoose.js. Затем вы можете добавить .explain(), чтобы увидеть план выполнения, используемый MongoDB:

> db.post.find({lowerCaseTitle: /your_regex_here/, status: {$gte: 0}, start: {$lt: now}, end: {$gt: now}}).sort({total: -1}).limit(50).explain()