Mongodb Mongo聚合:查找后的排序阶段和展开太慢
我有一个集合,它有大约30个属性,其中2个是与其他2个集合的关系(ObjectId)。我需要能够按两个子集合的列对父集合进行排序 为此,我编写了一个管道,如下所示:Mongodb Mongo聚合:查找后的排序阶段和展开太慢,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,它有大约30个属性,其中2个是与其他2个集合的关系(ObjectId)。我需要能够按两个子集合的列对父集合进行排序 为此,我编写了一个管道,如下所示: Document.aggregate([ { $match: { deleted: false, }, }, { $lookup: { from: 'companies', localField: 'company', foreignFie
Document.aggregate([
{
$match: {
deleted: false,
},
},
{
$lookup:
{
from: 'companies',
localField: 'company',
foreignField: '_id',
as: 'company',
},
},
{
$unwind:
{
path: '$company',
preserveNullAndEmptyArrays: true,
},
},
{
$lookup:
{
from: 'suppliers',
localField: 'supplier',
foreignField: '_id',
as: 'supplier',
},
},
{
$unwind:
{
path: '$supplier',
preserveNullAndEmptyArrays: true,
},
},
{
$sort: { 'company.name': -1 },
},
{
$skip: 0,
},
{
$limit: 10,
}
]);
问题是这太慢了。在Compass中,它超过了时间限制,当我在node中运行它时,处理它大约需要10秒。父集合的大小约为60k。如果没有分拣阶段,它将运行约25毫秒。另外,当我移动管道顶部的排序阶段时,它运行得非常快,但是如果我想按“company.name”属性排序,结果是不正确的。父集合中的“公司”和“供应商”属性都已编制索引
我已经读到,为了让排序阶段使用索引,它需要与“匹配”阶段一起放在管道的开头,但这不符合我通过子集合的属性进行排序的要求。是否不可能在100毫秒内完成此运行?我错过了什么
编辑1
以下是解释:
{ stages:
[ { '$cursor':
{ query: { state: true },
queryPlanner:
{ plannerVersion: 1,
namespace: 'test.documents',
indexFilterSet: false,
parsedQuery: { state: { '$eq': true } },
winningPlan:
{ stage: 'FETCH',
inputStage:
{ stage: 'IXSCAN',
keyPattern: { state: 1 },
indexName: 'state_1',
isMultiKey: false,
multiKeyPaths: { state: [] },
isUnique: false,
isSparse: false,
isPartial: false,
indexVersion: 2,
direction: 'forward',
indexBounds: { state: [ '[true, true]' ] } } },
rejectedPlans: [] } } },
{ '$lookup':
{ from: 'companies',
as: 'company',
localField: 'company',
foreignField: '_id',
unwinding: { preserveNullAndEmptyArrays: true } } },
{ '$lookup':
{ from: 'suppliers',
as: 'supplier',
localField: 'supplier',
foreignField: '_id',
unwinding: { preserveNullAndEmptyArrays: true } } },
{ '$sort': { sortKey: { 'company.name': -1 }, limit: 10 } } ],
ok: 1 }
在文档集合中,
公司
,供应商
,状态
字段都是索引。从公司
开始,以便排序和匹配,怎么样,然后$lookup
文档
进行删除
过滤?@willis:这是对前端数据表的动态搜索/过滤。可能有许多筛选器/排序等。包含最多数据的集合是大集合(60k个条目)。如果我从公司开始
,我觉得这不是一个永久的/最佳的解决方案,而且我几乎可以肯定其他方面会有问题。好吧,那么初始的$match
可能比显示的更复杂,对吗?我不太了解聚合管道,不知道是否有解决方案,但您可以尝试从管道的其余部分中分离出Document$match
,这样就可以按公司进行$match和$sort。如果你分享一些explain
output和你当前的索引,其他人可能会给出更好的建议。@willis更新了问题!Thanks@Arlind你找到解决办法了吗?