【问题标题】:Loop request Database vs lookup循环请求数据库与查找
【发布时间】:2020-04-29 10:18:47
【问题描述】:

我有一个问题,最近很头疼。所以我需要你的帮助。

我有 2 个集合:客户 (A)他们的历史付款 (B)。现在我需要从 A 获取所有数据,并通过 customer_id 将其映射到 B,然后将其显示为报告。 A 的示例数据为 100,000,B 为 500,000。

所以我应该使用查找来映射它并将数据返回到我的代码:

$customer_payments = $mongo_db->aggregate_pipeline('Customers',
    array(
        '$lookup' => array(
            'from' => 'payment_history',
            'localField' => 'customer_id',
            'foreignField' => 'id',
            'as' => 'payment_info',
        ),
    )
);

或者我读取所有A数据并循环然后将其一一读取到数据库以获取B数据并对其进行映射?

$customers = $mongo_db->get('Customers');
foreach ($customers as $key => $cus) {
    $payment_info = $mongo_db->where('customer_id', $cus['id'])->get('payment_history');
    $cus['payment_info'] = $payment_info;
}

我使用 PHP 和 MongoDB。 我的领导告诉我不要使用查找,而是一一阅读-_-。

到底哪一个更适合我和服务器的性能?

【问题讨论】:

  • 我认为你有提出一个好问题的条件,但正如所写的那样,它是在征求意见。这使它偏离主题。为了使其主题化,请展示一些示例代码并询问并询问如何做到这一点,或者询问该方法是否存在任何问题。
  • 我也不知道您所说的“使用查找映射”与“循环并逐个读取”是什么意思。听起来你只需要一个更好的查询。
  • 感谢您的想法,我将编辑我的问题以使其更易于理解并成为主题
  • 我想我明白了。免责声明:我不知道 mongoDB,也不知道这个包装器对象$mongo_db。但是我可以让你从可能不得不在你之后维护代码的人的眼中看到它。在这两种方法中,后者对我来说更直观,因为方法的命名更像 sql。它也可能效率较低,因为每次迭代都会产生数据库调用的开销。对于一般的网页,这可以忽略不计;但如果尺寸太大,则需要优化。前一个查询 OTOH 大概连接了表......
  • 一起使用,效率和可扩展性会高得多。唯一的缺点是方法的命名很糟糕,让你不得不考虑它在做什么。我从您的问题的上下文中理解了它,但是输入其中的数组具有不立即显而易见的规则。

标签: php mongodb architecture


【解决方案1】:

肯定是 $lookup

在您的情况下,MongoDB 以非常短的时间和高效的方式通过索引字段执行左外连接两个集合。此外,您可以使用payment_info 继续流水线阶段。

手动迭代记录效率极低(payment_history 中的 100.000 次查询将花费 PHP / MongoDB 小时...)。

【讨论】:

  • 我也认为第一种方法比第二种方法好。但是我的领导不同意并告诉我使用第二个嗯。顺便说一句,谢谢你的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2014-01-12
  • 2021-10-21
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多