我需要帮助MongoDb使用PHP驱动程序。
我有4个收藏品:
order_aproved:
{
"order_id" : mongoId ,
"user_id":num ,
"order_date":mongoDate ,
"requset" : string
}
orders_rejected:
{
"order_id" : mongoId,
"user_id" : num ,
"order_date" : mongoDate ,
"requset" : string
}
用户:
{
"user_id" : mongoId,
"username" : num ,
"last_order" : mongoDate ,
"num_orders" : num,
"last_order"
}
orders_log:
{
"order_id" : mongoId ,
"order_date" : mongoDate ,
"status" : boolen ,
"user_id" : num
}
每个已批准/已拒绝的订单,我都会更新用户文档上的num_orders
有新的/拒绝的订单。所以这个数字总是在变化
并在orders_log
上记录该订单。
我需要通过有条件的用户列表orders_log
来获取[array]
上已批准/已拒绝的所有订单,并获取该订单的订单数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驱动程序上 谢谢!
答案 0 :(得分:1)
在这种情况下,有两种方法可以获得性能提升:
在MongoDB上创建一个索引:
db.order_aproved.createIndex( { user_id: 1 } )
您可以按上述方式或在后台创建上述索引:
db.order_aproved.createIndex( { user_id: 1 }, { background: true } )
在最后一种情况下,创建速度会变慢,但它不会打扰数据库上当前正在进行的操作。如果你可以负担得起,我认为你应该更好地创建一个不在后台的索引,尤其是。如果没有在生产数据库上运行此脚本
重新设计集合,以便在主文档中创建嵌入文档而不是通过某些ID加入的不同集合,从而无需执行任何操作,类似于RDBMS中的JOIN
。
在上面,在你的情况下,最简单和更直接的解决方案,在我看来是第一个。选择它,您还可以避免嵌入式文档更新中的性能损失