Mongodb 如何查看mongoose.js查询的执行计划

Mongodb 如何查看mongoose.js查询的执行计划,mongodb,mongoose,Mongodb,Mongoose,我想验证我正在创建的mongoose查询是否使用我的索引。是否有一种方法可以查看生成到mongodb的最终查询,以便对查询运行.explain() 我可以猜出它生成的查询是什么,但我只是想验证一下 e、 g 一种方法是使用mongodb探查器并将其设置为记录所有操作: 我不确定是否有一种更简单的方法可以通过猫鼬本身来实现,但那会很好 更新:除了Dan在另一个答案的评论中所说的,你应该打开探查器来获取你想要的,然后再关闭它。将其保留为“记录所有操作”绝对是降低系统速度的好方法。将其限制在开发环境

我想验证我正在创建的mongoose查询是否使用我的索引。是否有一种方法可以查看生成到mongodb的最终查询,以便对查询运行.explain()

我可以猜出它生成的查询是什么,但我只是想验证一下

e、 g


一种方法是使用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)=>{
     ...
  })