首页 > 解决方案 > Mongo DB join 集合执行时间

问题描述

我有一个集合,每小时将追加 15000 条记录。我需要将此数据与另一个集合连接(CMDB 集合 - 80000 条记录)

数据:

_id.* = 数据来自名为“传入”的集合 $$ = 数据来自 CMDB 集合

使用的查询:

{
   $lookup:
     {
       from: "CMDB",
       
       let: { DataSvrName: "$_id.DataSvrName",ServerIP: "$_id.Server IP",ServerType: "$_id.Server Type",ShortHostName: "$_id.ShortHostName",ServerPort:"$Server Port"},

       pipeline: [
            {$match: {  $expr:  {$or: [
            
{$and: [
             {$regex: ["$$ServerType", "MS SQL SERVER|ORACLE|SYBASE" ]},
              {$eq: [ "$$DataSvrName", "$DataSvrName"]}
                ]
        },
        
        {$and : [
            { $eq: [ "$$ServerType", "MS SQL SERVER" ]},
            { $or :[{$eq: [ "$$ServerIP", "$Machine_IP" ] },{$eq: [ "$$DataSvrName", "$ShortHostName" ] }]} ]
        },
        
        {$and : [
            {$eq: [ "$$ServerType", "SYBASE" ]},
            { $and : [{$eq: [ "$$DataSvrName", "$ServerName" ] },{$eq: [ "$$ServerPort", {$toString:"$ServerPort" }] }]} ]
        },
        
        {$and : [
            {$regex: [ "$$ServerType","MONGODB|DB2|SYBASE|POSTGRESQL"]},
            { $and : [{$eq: [ "$$ServerIP", "$Machine_IP" ] },{$eq: [ "$$ServerPort", {$toString:"$ServerPort" } ] }]} ]
        },
        
        {$and : [
            {$and:[{$eq: [ "$$ServerType", "ORACLE" ]},{$eq:["$$DataSvrName", null]}]},
            {$or :[{$eq: [ "$$ServerIP", "$Machine_IP" ]},{$eq: [ "$$ShortHostName","$hortHostName" ] } ]} ]
        }
 ]}}},{$limit:1},
{$project: {*:1}}
        ],
       as: "CMDB" 
     },

}

传入收集数据限制为 100 个,执行时间为 42 秒,传入收集数据限制为 2000 个,执行时间为 9.26 秒。

如果我们执行 15000 条记录,应用程序就会超时。

问题 :

  1. 我们可以改进查询以减少执行时间吗?
  2. 还有其他加入收藏的可能性吗?

标签: mongodb-querypipeline

解决方案


推荐阅读