2017-07-07 56 views
2

我需要MongoDb和PHP驅動程序的幫助。Mongo PHP從另一個集合和更新文檔加入數據 - 像SQL JOIN

我有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 
    } 
    

每間覈准/拒絕訂單,我對用戶文檔 更新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添加到我有沒有找到一個使用doc形成花葯查詢

像SQL JOIN,但在Mongo和PHP驅動程序 謝謝!

+0

可能重複[mongodb連接式查詢,帶有兩個集合和where子句](https://stackoverflow.com/questions/21067464/mongodb-join -like-queries-with-two-collections-and-a-where-clause) – BenRoob

+1

我需要mongo和php,你的回答只是mongo,它不像我的問題,謝謝 – user2843540

+0

我對這個解釋有點失落。 「用戶列表」來自哪裏?這是外部輸入還是意味着要從其中一個集合中檢索?你是否確實意味着需要通過「已批准」和「已拒絕」來完成清單的某種選擇?我們只是基本上向當前用戶添加「已批准」**減去**「已拒絕」 num_orders'?此外,這只是爲稍後的「更新」收集數據,對嗎?半相關的是爲什麼''requset''被檢查爲'> 0'長度?這可以做不同? –

回答

1

有兩種方法來實現性能增益在這種情況下:

  1. 對MongoDB的創建索引:
    db.order_aproved.createIndex({ user_id: 1 })
    您可以創建上述指標無論是在上面的方式,或在背景:
    db.order_aproved.createIndex({ user_id: 1 }, { background: true })
    在最後一種情況下,創建速度會比較慢,但不會影響當前正在進行的數據庫操作。如果你負擔得起,我認爲你應該更好地創建一個不在後臺的索引,尤其是。如果未在生產數據庫上運行此腳本,則應重新設計集合,以便代替通過某些ID加入的不同集合,您應該在主文檔內部創建嵌入文檔,從而消除需要執行任何操作,類似於RDBMS中的JOIN

以上,在你的情況下,最簡單和更直接的解決方案,在我看來,第一個。選擇它,你也將避免嵌入式文檔更新中的性能損失

相關問題