Mongo PHP连接来自另一个集合和更新文档的数据 - 比如SQL JOIN

时间:2017-07-07 12:17:45

标签: php mongodb

我需要帮助MongoDb使用PHP驱动程序。

我有4个收藏品:

  1. order_aproved:

    {
       "order_id" : mongoId ,
       "user_id":num ,
       "order_date":mongoDate ,
       "requset" : string 
    }
    
  2. orders_rejected:

    {
      "order_id" : mongoId,
      "user_id" : num ,
      "order_date" : mongoDate ,
      "requset" : string
    }
    
  3. 用户:

    {
      "user_id" : mongoId,
      "username" : num ,
      "last_order" : mongoDate ,
      "num_orders" : num,
      "last_order"
    }
    
  4. orders_log:

    {
       "order_id" : mongoId  ,
       "order_date" : mongoDate ,
       "status" : boolen ,
       "user_id" : num
    }
    
  5. 每个已批准/已拒绝的订单,我都会更新用户文档上的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驱动程序上 谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,有两种方法可以获得性能提升:

  1. 在MongoDB上创建一个索引:
    db.order_aproved.createIndex( { user_id: 1 } )
    您可以按上述方式或在后台创建上述索引:
    db.order_aproved.createIndex( { user_id: 1 }, { background: true } )
    在最后一种情况下,创建速度会变慢,但它不会打扰数据库上当前正在进行的操作。如果你可以负担得起,我认为你应该更好地创建一个不在后台的索引,尤其是。如果没有在生产数据库上运行此脚本

  2. 重新设计集合,以便在主文档中创建嵌入文档而不是通过某些ID加入的不同集合,从而无需执行任何操作,类似于RDBMS中的JOIN

  3. 在上面,在你的情况下,最简单和更直接的解决方案,在我看来是第一个。选择它,您还可以避免嵌入式文档更新中的性能损失