2012-03-28 3 views
11

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

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

например.

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

ответ

-2

Один из способов заключается в использовании MongoDB профилировщика и установить его регистрировать все операции:

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

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

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

-3

Самый простой способ - просто повторить этот запрос в оболочке 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() 
+2

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

+0

Ах, извините, я неправильно понял. В этом случае вы можете проверить, используя профилировщик, как предлагает Wes Freeman, но я бы сделал это только во время разработки, а не в производстве. Профилировщик несет некоторые накладные расходы, поэтому он не рекомендуется для использования в производстве. – dcrosta

39

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

mongoose.set('debug', true); 

или

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

безусловно правильный ответ, пожалуйста, выберите этот – electblake

Смежные вопросы