为什么使用$ match按id对文档排序比在mongodb中慢?

时间:2019-12-27 08:49:39

标签: mongodb mongodb-query aggregation-framework aggregate

所以,我试图查询

db.collection('collection_name').aggregate([
    {
        $match: { owner_id: '5be9b2f03ef77262c2bd49e6' }
    },
    {
        $sort: { _id: -1 }
    }])

上面的查询占用20秒

但如果我尝试查询

db.collection('collection_name').aggregate([{$sort : {_id : -1}}])

仅需0.7秒

为什么没有$ match的那个实际上比不匹配的要快?

更新: 当我尝试此查询

db.getCollection('callbackvirtualaccounts').aggregate([
    {
        $match: { owner_id: '5860457640b4fe652bd9c3eb' }
    },
    {
        $sort: { created: -1 }
    }
])

只需要0.781秒

为什么按_id排序比按创建的字段慢?

注意:我正在使用mongodb v3.0.0

2 个答案:

答案 0 :(得分:0)

db.collection('collection_name').aggregate([
{
    $match: { owner_id: '5be9b2f03ef77262c2bd49e6' }
},
{
    $sort: { _id: -1 }
}])

该集合可能不会在owner_id上建立索引。尝试使用下面提到的索引创建查询,然后重新运行以前的代码。

db.collection('collection_name').createIndexes({ owner_id:1}) //Simple Index
 or 
db.collection('collection_name').createIndexes({ owner_id:1,_id:-1}) //Compound Index

**注意::如果您还不知道如何复合索引,则可以在用于匹配或排序的所有键上分别创建简单索引,这也应该使查询效率更高。

答案 1 :(得分:0)

查询速度取决于很多因素。集合的大小,文档的大小,在集合上定义的索引(以及在查询中正确使用的索引),硬件组件(例如CPU,RAM,网络)以及在查询运行时正在运行的其他进程。

您必须知道正在讨论的集合上定义了哪些索引以进行进一步分析。该命令将检索它们:import { Component, ViewChild, ElementRef } from '@angular/core'; @Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: [ './app.component.css' ] }) export class AppComponent { modeNewEntry = false; @ViewChild('textCreate', { static: false }) textCreateComponent: ElementRef; showComponent() { this.modeNewEntry = true; this.textCreateComponent.nativeElement.scrollIntoView(); } }

请注意,db.collection.getIndexes()字段上的唯一索引是默认创建的,无法修改或删除。

(i)

  

但是,如果我尝试查询:_id,那就是   只需0.7s。

查询速度更快,因为db.collection.aggregate( [ { $sort : { _id : -1 } } ] )字段上有一个索引,该索引在排序过程中使用。聚合查询使用具有排序阶段以及何时在管道中进行这种排序的索引。您可以通过生成查询计划来验证是否使用了索引(将_idexplain模式一起使用)。生成的查询计划中将进行索引扫描(IXSCAN)。


(ii)

executionStats
     

上面的查询需要20秒。

     

当我尝试此查询时,仅需0.781s。

db.collection.aggregate([
    {
        $match: { owner_id: '5be9b2f03ef77262c2bd49e6' }
    },
    {
        $sort: { _id: -1 }
    }
])
     

为什么按_id排序比按创建的字段慢?

无法根据可用信息得出任何结论。 通常,聚合查询中较早出现的db.collection.aggregate([ { $match: { owner_id: '5860457640b4fe652bd9c3eb' } }, { $sort: { created: -1 } } ]) $match阶段可以使用在操作中使用的字段上创建的任何索引。

生成查询计划将揭示问题所在。

请以$sort模式运行explain,并发布所有相关查询的查询计划详细信息。有关使用 explain 的生成查询计划的Mongodb v3.0.0版本的文档:db.collection.explain()