2012-01-18 49 views
0

我想要複製Mongo中的MySql中的左連接。我有一個名爲Clients的集合和另一個集合名稱Orders。Mongo - 從兩個集合中構建表

在客戶端收集有:

client_PK, FirstName, LastName, Company 

在訂單收集我:

order_PK, client_fk, OrderDate, OrderAmount, 

所以我知道可以使用嵌入文檔,但對這個問題的緣故我期待使用參考模型。

我的問題是,使用這兩個集合我將如何構造一個類似於左連接的表或對象?我知道這是一個文檔數據庫不是關係型數據庫,但即時通訊使用SQL語言只是爲了讓你知道我想要完成什麼。在MySQL它應該是這樣的:

SELECT * FROM orders LEFT JOIN clients ON clients.client_PK = orders.client_fk 

有了這個,我現在可以構建一個看起來像一個表:

FirstName | LastName | Company | OrderDate | OrderAmount 

然後我可以重複使用while循環來顯示所有訂單,並顯示該行客戶名稱與訂單。我再次知道mongo不是關係數據庫,但我假設有一種方法使用兩個集合來模擬一個表。

謝謝。

+0

請停止標記你的問題「couchdb。」這浪費了人們的時間。謝謝。 – JasonSmith

回答

1

你幾乎肯定希望將這些數據都存儲在同一個MongoCollection中(即使只是一個非規範化集合)。

如果你絕對不能做到這一點,雖然,如果你的永久變形小,你可以做一些類似的(因爲你問PHP):但是

<?php 
// gather orders 
$orders = iterator_to_array($mongodb->orders->find()); 
$joinedOrders = array(); 
// gather clients 
foreach ($db->clients->find() as $client) { 
    // iterate orders (like a left join) 
    foreach ($orders as $order) { 
     // make a "joinedOrders" record for each join match 
     if ($order['client_fk'] == $client['client_PK']) { 
      $joinedOrders[] = array_merge($order, $client); 
     } 
    } 
} 
// result is now in $joinedOrders 

這是, ,幾乎總是一個壞主意。 ( - :你真的應該反規範化你的數據,或者使用關係數據庫來存儲/查詢關係數據。

1

我假設有一種方法使用模擬兩個集合

的MongoDB沒有這樣做的任何工具的表。你基本上會「滾動你自己的」連接。在基本級別上,這意味着您將不得不編寫嵌套for循環並在代碼中構建結果集。

做這種「額外的邏輯」在MongoDB中很常見,因爲缺少連接。如果您看到這種模式很多,您可能需要考慮將SQL用於部分數據。

+0

我是新手,我明白你在暗示我做什麼,但我不知道如何「滾動」或寫下它。你能給一個例子在PHP?謝謝。 – user982853

+1

看看@scoates答案,他有一些基本的代碼。但是,如果你不能自己編寫代碼,我要警告不要使用MongoDB MongoDB是一個功能強大的產品,但它沒有太多的工具,並且不提供SQL的所有功能,嵌套連接是最少的您需要做的額外工作,Map/Reduce顯得更加複雜。 –