【发布时间】: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 来计算过滤集合中的一些值。 Timestamp、price 和 amount 最小和最大范围是可选的。收集过滤后,我必须计算 文件数量取决于类型,金额总和取决于类型,价格和金额的最小/最大/平均值。此外,根据过滤集合中的第一个和最后一个文档的时间戳,应该创建与时间戳范围相关的折线图数据。
我在 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