MongoDB 查找与聚合性能

Posted

技术标签:

【中文标题】MongoDB 查找与聚合性能【英文标题】:MongoDB find vs aggregate performance 【发布时间】:2017-06-20 10:16:18 【问题描述】:

我正在尝试衡量 MongoDB 的查找与聚合性能。 有什么方法可以比较聚合与匹配并查找查询性能。

目前我正在使用 javascript 来衡量它。 如find():

var start = (new Date).getTime();
db.assets.find(
  "catalog_id":"f1a7669654584a42958d9589cf37d173",
  "albums":"$elemMatch":"id":"5f7938ce6e2718eb776f82474f2e093f","order":"$exists":false
);
var end = (new Date).getTime();
print("elapsed " + (end - start) +" msec");

作为aggregate():

var start = (new Date).getTime();
db.assets.aggregate([
  
    "$match":
      "catalog_id":"f1a7669654584a42958d9589cf37d173",
      "albums":"$elemMatch":"id":"5f7938ce6e2718eb776f82474f2e093f","order":"$exists":false
    
  
]);
var end = (new Date).getTime();
print("elapsed " + (end - start) +" msec");

但这对我来说似乎不对。 有人可以建议其他方法吗?

【问题讨论】:

当聚合管道仅包含 $match 阶段时,find()aggregate() 之间没有区别。查看这些查询中的explain(),以更好地了解这里发生的情况 我已经尝试过解释。但在聚合的情况下它不会给出执行时间。想要测量两个查询所花费的时间。 【参考方案1】:

db.collection.explain() 操作可以返回以下信息:

queryPlanner,详细说明query optimizer 选择的计划并列出被拒绝的计划; executionStats,详细说明获胜计划和被拒绝计划的执行情况;和 serverInfo,提供有关 MongoDB 实例的信息。

find()怎么解释?

db.assets.explain("executionStats").find(
  "catalog_id":"f1a7669654584a42958d9589cf37d173",
  "albums":"$elemMatch":"id":"5f7938ce6e2718eb776f82474f2e093f","order":"$exists":false
);

aggregate()怎么解释?

db.assets.explain("executionStats").aggregate([
  
    "$match":
      "catalog_id":"f1a7669654584a42958d9589cf37d173",
      "albums":"$elemMatch":"id":"5f7938ce6e2718eb776f82474f2e093f","order":"$exists":false
    
  
]);

【讨论】:

以上是关于MongoDB 查找与聚合性能的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 聚合 - $lookup 性能

Mongodb 查找与聚合匹配返回一个空数组

MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?

MongoDB,如何将查找和排序与聚合中的 $cond 结合起来?

MongoDB 查找与使用聚合指定的任何条件匹配的文档

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?