Как я могу просмотреть план выполнения запроса mongoose.js - PullRequest
12 голосов
/ 28 марта 2012

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

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

, например

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

Ответы [ 5 ]

47 голосов
/ 23 апреля 2014

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

mongoose.set('debug', true);

или

mongoose.set('debug', function (collectionName, method, query, doc, options) {
  //
});
1 голос
/ 11 декабря 2018

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

model
  .find()
  .{{...}} // any thing else
  .setOptions({explain: 'executionStats'})
  .exec((e, explainObj)=>{
     ...
  })
0 голосов
/ 10 сентября 2018

Вы также можете использовать 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);
0 голосов
/ 28 марта 2012

Самый простой подход - просто скопировать этот запрос в оболочке 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()
0 голосов
/ 28 марта 2012

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

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

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

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

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