【问题标题】:Fast calculation of statistic on large amount of documents in MongoDB快速计算MongoDB中大量文档的统计量
【发布时间】:2018-10-31 15:36:01
【问题描述】:

我的文档架构:

  {
    symbol: String,
    exchange: String,
    price: Number,
    amount: Number,
    type: {
        type: String,
        enum: ['buy', 'sell']
    },
    timestamp: Number
}, {
    autoIndex: false,
    id: false,
    versionKey: false
});

我的 MongoDb Atlas 集群中有 40+ 百万个文档。所有文档都附加到一个大型集合中。

我需要通过至少一个参数 - symbol 来计算过滤集合中的一些值。 Timestamppriceamount 最小和最大范围是可选的。收集过滤后,我必须计算 文件数量取决于类型,金额总和取决于类型,价格和金额的最小/最大/平均值。此外,根据过滤集合中的第一个和最后一个文档的时间戳,应该创建与时间戳范围相关的折线图数据。

我在 Node.js 上使用 Mongoose ORM,find() 方法处理 100K 文档的速度非常慢,需要 100 秒!

如何为我的案例实现最佳性能?

【问题讨论】:

  • 收集过滤后,我必须根据类型计算文档数,金额总和取决于类型,价格和金额的最小值/最大值/平均值 - 你想在这里做 groupby 吗?或者它将是一个带有 {type: "sometype"}? 的查询。您可以发布示例查询吗?
  • 首先,我尝试过类似的方法: let cursor = Trade.find(findFilters).lean(true).cursor() let trades = []; cursor.on('data', (item) => { trades.push(item) }) cursor.on('close', () => { res.send({ symbol: req.query.symbol, 输入: req.query.type,参数:req.body,结果:计算(交易)})});其中 findFilters - { exchange: 'exchange', symbol: 'symbol', type: 'sell' ... }
  • 一个代码块值一千字。我强烈建议您在问题中添加代码示例(而不是作为评论!),以便我们了解您想要实现的目标以及失败的地方。

标签: node.js mongodb optimization mongoose nosql


【解决方案1】:

创建索引 { symbol: "hashed", price: 1, timestamp: 1 } 将响应时间减少到足够的 1 秒。

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 2016-05-19
    • 2010-11-28
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多