Как я могу просмотреть план выполнения запроса 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()