在Node.js中优化MongoDB查询获取TotalRecord

问题描述 投票:0回答:1

我的 Node.js 应用程序中有一个 MongoDB 查询,我想对其进行优化以获得更好的性能。查询如下所示:

const CampaignStepHistoryList = await CampaignStepHistory.aggregate([
    {
        $match: {ClientID: new ObjectId(ClientID), UserID: new ObjectId(UserID), IsSentMail: true,
    },
    },
      {
        $addFields: {
          MailSentDateByTimeZones_temp: {
            $dateToString: {
              format: "%Y-%m-%d",
              date: "$MailSentDateByTimeZone",
            },
          },
        },
      },
      {
        $match:{
          MailSentDateByTimeZones_temp: { $gte: "2024-01-01", $lte: "2024-03-21",
          },
        }
   },
      
  {
    $lookup: {
      from: "campaigns",
      let: {
        flag: false,
        cID: "$CampaignID",
        cId: "$ClientID",
        uID: "$UserID",
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [{ $eq: ["$_id", "$$cID"] },
                { $eq: ["$UserID", "$$uID"] },
                { $eq: ["$ClientID", "$$cId"] },
              ],},},},
      ],
      as: "C",
    },
  },
  {
    $unwind: {
      path: "$C",
      preserveNullAndEmptyArrays: false,
    },
  },
  {
    $count: "totalRecords"
}
  
])

获取 MongoDB 中包含 3300 万条记录的集合中的总记录数 如何在零秒内获得这么多记录。 我已经尝试通过索引,所以在零秒内是不可能的。

node.js mongodb mongoose mongodb-query
1个回答
0
投票

在不了解数据模型的情况下很难评估数据库性能,但这里有一个尝试:

const CampaignStepHistoryList = await CampaignStepHistory.aggregate([
   {
      $match: {
         ClientID: new ObjectId(ClientID), 
         UserID: new ObjectId(UserID), 
         IsSentMail: true,
         MailSentDateByTimeZone: { $gte: new Date("2024-01-01"), $lte: new Date("2024-03-21")}
      },
   },
   {
      $lookup: {
         from: "campaigns",
         let: {
           flag: false,
           cID: "$CampaignID",
           cId: "$ClientID",
           uID: "$UserID",
         },
         pipeline: [
            {
               $match: {
                  $expr: {
                     $and: [
                        { $eq: ["$_id", "$cID"] },
                        { $eq: ["$UserID", "$uID"] },
                        { $eq: ["$ClientID", "$cId"] },
                     ],
                  },
               },
            },
         ],
         as: "C",
      },
   },
   {
      $unwind: {
         path: "$C",
         preserveNullAndEmptyArrays: false,
      },
   },
   {
      $count: "totalRecords"
   }
])

可能非常小,您最好更有效地对数据建立索引,以进行查找。如果您只想对数据进行计数,那么最好将计数存储在其自己的行上,并使用查询的唯一属性作为关键

© www.soinside.com 2019 - 2024. All rights reserved.