【问题标题】:mongodb complex query between two collections两个集合之间的mongodb复杂查询
【发布时间】:2018-06-29 06:10:32
【问题描述】:

对 node 和 mongo 来说相当陌生。我是来自关系数据库背景的开发人员。

我被要求写一份报告来计算从与车辆修理厂预订相关的潜在客户到发票的转化率。转化是指在产生潜在客户后 60 天内生成发票。

所以我已经使用 mongodb、mongoose 和 nodejs 将所有数据从平面文件导入到两个集合、潜在客户和发票中。在 5 年期间,我有 100 万条潜在客户和大约 3000 万张发票,费率将按月计算。所有数据都有共同的车辆注册。

所以我的问题是如何将数据与 mongoose 和 nodejs 连接在一起?

到目前为止,我已经尝试过任何单个潜在客户,因此请在 60 天内找到任何发票,以使潜在客户符合转化条件。这可行,但我的脚本在大约 20 次左右成功更新后停止。在这一点上,我认为我的脚本对每个潜在客户的发票进行单独查询对 mongodb 的负载太重,我可以看到对 mongodb 进行数百万个单独查询太多了。

浏览了几个小时后,我不确定我应该寻找什么!?

任何帮助将不胜感激。

【问题讨论】:

  • 一些可能有用的东西 1) 聚合 2) 批处理

标签: javascript node.js mongodb mongoose


【解决方案1】:

您的尝试应该没有问题。但是,对大数据 M​​ongo DB 实例及其分析有什么帮助:直接在 Mongo 中运行查询,而不是通过 Node.js 运行查询。这样,您就不必将 Mongo 结构(例如迭代器)转换为 Node 结构(例如数组),并且通常会损失很多开销。

另外,请确保您有正确的索引设置。就大型数据库的性能而言,这可能是一个巨大的差异。

然后我会做的是(这应该被认为是伪代码):

let converted = 0;
db.leads.find({},{id: 1, date: 1}).forEach(lead => {
    const hasInvoices = db.invoices.count({leadId: lead.id, date: {$lt: lead.date + 60}});
    converted ++;

});

为了加快速度,我会在这种情况下使用以下索引:

db.invoices.createIndex({leadId: 1, date: -1});

【讨论】:

  • 我会尝试一下并将我的结果发布在这里,非常感谢您的时间
  • 非常感谢您的帮助@jonas-w,决定沿着聚合路线走下去,现在一切正常:)
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2010-11-24
  • 2021-07-25
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多