Mongodb 如何查看mongoose.js查询的执行计划
我想验证我正在创建的mongoose查询是否使用我的索引。是否有一种方法可以查看生成到mongodb的最终查询,以便对查询运行.explain() 我可以猜出它生成的查询是什么,但我只是想验证一下 e、 gMongodb 如何查看mongoose.js查询的执行计划,mongodb,mongoose,Mongodb,Mongoose,我想验证我正在创建的mongoose查询是否使用我的索引。是否有一种方法可以查看生成到mongodb的最终查询,以便对查询运行.explain() 我可以猜出它生成的查询是什么,但我只是想验证一下 e、 g 一种方法是使用mongodb探查器并将其设置为记录所有操作: 我不确定是否有一种更简单的方法可以通过猫鼬本身来实现,但那会很好 更新:除了Dan在另一个答案的评论中所说的,你应该打开探查器来获取你想要的,然后再关闭它。将其保留为“记录所有操作”绝对是降低系统速度的好方法。将其限制在开发环境
一种方法是使用mongodb探查器并将其设置为记录所有操作: 我不确定是否有一种更简单的方法可以通过猫鼬本身来实现,但那会很好
更新:除了Dan在另一个答案的评论中所说的,你应该打开探查器来获取你想要的,然后再关闭它。将其保留为“记录所有操作”绝对是降低系统速度的好方法。将其限制在开发环境中也是一个好主意。最简单的方法可能是在MongoDB shell中复制该查询。比如:
> 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()
您可以使用mongoose上的调试选项获取执行查询:
mongoose.set('debug', true);
或
您也可以直接使用(如Mongoose 5.2.13)
另一种选择:
model
.find()
.{{...}} // any thing else
.setOptions({explain: 'executionStats'})
.exec((e, explainObj)=>{
...
})
我可以猜到它正在创建的查询,但我想确认这确实是从mongoose发送给mongo的内容。啊,对不起,我误解了。在这种情况下,您可以按照Wes Freeman的建议使用分析器进行验证,但我只会在开发过程中进行验证,而不会在生产过程中进行验证。探查器会带来一些开销,因此不建议在生产中使用。
mongoose.set('debug', function (collectionName, method, query, doc, options) {
//
});
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);
model
.find()
.{{...}} // any thing else
.setOptions({explain: 'executionStats'})
.exec((e, explainObj)=>{
...
})