我需要有关 MongoDb 和 PHP 驱动程序的帮助。
我有 4 个集合:
order_aproved :
{ "order_id" : mongoId , "user_id":num , "order_date":mongoDate , "requset" : string }
订单被拒:
{ "order_id" : mongoId, "user_id" : num , "order_date" : mongoDate , "requset" : string }
用户:
{ "user_id" : mongoId, "username" : num , "last_order" : mongoDate , "num_orders" : num, "last_order" }
订单日志:
{ "order_id" : mongoId , "order_date" : mongoDate , "status" : boolen , "user_id" : num }
每个批准/拒绝的订单,我都会更新用户文档中的 num_orders
有新的/被拒绝的订单。所以这个数字总是在变化
并将该订单记录在 orders_log
中。
我需要根据用户列表 [array]
获取所有在 orders_log
上批准/拒绝的订单,并获取订单数 num_orders
以及该用户的订单的最后订单日期
我是这样做的:
$cursor = $orders->find()->sort(array("order_date" => -1))->limit(15);
$array = iterator_to_array($cursor,false);
$users_for_aproved = ["123","124","125"];
$users_for_rejcted = ["112","113","114"];
$js = "function() { if ( this.requset ) { return this.requset.length > 0 } }";
$query1 = array( '$and' => array(
array("user_id" => array('$in'=> $users_for_aproved)),
array('$where' => $js )
));
$query1 = array( '$and' => array(
array("user_id" => array('$in'=> $users_for_rejcted)),
array('$where' => $js )
));
$query_or = array('$or' => array($query,$query1);
$cursor = $orders_log->find($query_or)->sort(array("order_date" => -1))->limit(15);
$array = iterator_to_array($cursor,false);
for ( $x=0; $x < count($array) ; $x++ ) {
$query = array( "user_id" => $order["user_id"] );
$cursor = $orders->find($query)->limit(1);
$array = iterator_to_array($cursor,false);
$order_count = $array[0]["num_orders"];
$array[$x]["order_count"] = $order_count;
}
return $array;
它正在工作,但效率不高,我需要一种方法来从另一个集合中获取数据,并将 num_orders 添加到我找到的文档中,而无需使用表单花药查询
像 SQL JOIN 但在 mongo 和 php 驱动程序上 谢谢!
最佳答案
在这种情况下,有两种方法可以提高性能:
在 MongoDB 上创建索引:
db.order_aproved.createIndex( { user_id: 1 } )
您可以通过上述方式创建上述索引,也可以在后台创建:
db.order_aproved.createIndex( { user_id: 1 }, { background: true } )
在最后一种情况下,创建会比较慢,但不会打扰当前正在进行的数据库操作。如果您负担得起,我认为您最好不要在后台创建索引,尤其是。如果不在生产数据库上运行此脚本重新设计集合,这样您就可以在主文档中创建嵌入文档,而不是通过一些 ID 连接不同的集合,从而无需执行任何操作,类似于 RDBMS 中的
JOIN
。
在我看来,在您的情况下,上述最简单、更直接的解决方案是第一个。选择它,您还将避免更新嵌入式文档时的性能损失
关于php - Mongo PHP 加入来自另一个集合的数据并更新文档 - 如 SQL JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970568/