【发布时间】: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