繁体   English   中英

MongoDB 中大型集合的聚合性能

[英]Aggregation performance on large collection in MongoDB

我在 mongodb 中有一个很大的集合。 它在该集合中有大约 70-8000 万份文件。 但是当我在其上运行聚合管道时,返回结果需要将近 5 分钟。 有什么办法可以减少聚合结果时间?

我无法获得任何相关解决方案来减少聚合管道的时间。

下面是示例文档。

   {
  "data": {
    "_id": "5e557779ed588826d84cef27",
    "meter_id": "1001",
    "date": "2017-10-31T18:52:00.000Z",
    "parameter_name": "hvac",
    "voltage": {
      "unit": "V",
      "Voltage": 0
    },
    "current": {
      "unit": "AMP",
      "Current": 0
    },
    "powerFactor": {
      "unit": "phi",
      "PowerFactor": 0
    },
    "angle": {
      "unit": "degree"
    },
    "activePower": {
      "unit": "kwh"
    },
    "reactivePower": {
      "unit": "kwh"
    },
    "apparentPower": {
      "unit": "kwh",
      "ApparentPower": 0
    },
    "frequency": {
      "unit": "hz",
      "Frequency": 0
    },
    "thd": {
      "unit": "percentage"
    },
    "energy": {
      "unit": "J",
      "Energy": 0
    },
    "power": {
      "unit": "watt",
      "Power": 0
    },
    "__v": 0
  }
}

下面是我正在使用的聚合管道

MeterData.aggregate([
  {
    $match: {
        $expr: {
            $and: [
                 {$gt: ["$date", checkDate] },
                { $lt: ["$date", moment(checkDate).add(1, 'years')._d] },
              ]
        }

    }
},
{

  $group: {
    _id: {  
      day: { $dateToString: { format: "%Y-%m", date: "$date" } },
      meter: '$meter_id'

  },
  totalEnergy: { $sum: { $toDouble: "$energy.Energy" } },
  }
},
{
    $project: {
        meter_id: '$_id.meter',
        month: '$_id.day',
        totalEnergy: '$totalEnergy',
                _id: 0
    }
},
{
    $sort: { month: 1 }
}

谢谢您的帮助。

对此的两种选择:

  1. 您可以在您特别需要查询的字段上创建索引。 这是第一个推荐的方法。 关联
  2. 在包含引用的现有集合之上创建摘要集合。 所以本质上,这意味着您有一个唯一标识当前集合中的记录的键,然后在顶部创建一个包含这些引用的摘要集合。 这也将导致用户前端发​​生变化,您可以根据检索的内容将结果描绘为多个步骤。 对于大数据的 UX 与查询时间性能而言,始终是一个很好的权衡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM