2012-06-14 23 views
0

我正在開發一個使用PHP和MongoDB的web應用程序。在這個應用程序我保留兩個集合。一個用於保存有關文件的數據,另一個用於跟蹤每個文件的下載事件。如何在MongoDB中進行假連接?

我需要得到10個最新下載的文件,但我知道連接不是一個選項。事件文檔僅存儲文件ID,其他集合存儲縮略圖。

現在,我第一次得到10個最近下載的文件,並按日期排序,順序很好,但然後我使用這個文件數組(他們的ID),並做一個where_in查詢,我在哪裏尋找文件,在ids數組中。這也工作正常(我得到所選文件的縮略圖),但我不能保持順序了。最近下載的文件不再位於最前面。

如何在不循環它們的情況下保持ID的順序,從而製作出10個新的查詢而不僅僅是一個?

我無法改變的模式,因爲我得到了40.000的文件:)

UPDATE

總之這是我想做的事:

  1. 獲取所有的ID 10個最近下載的文件。按下載時間戳排序。
  2. 使用這個ID數組,並對文件集合進行查詢並獲取每個文件的詳細信息,如縮略圖,描述等。

上述步驟工作正常,但我無法保持從第一步的順序,因此我無法得到最近下載的文件頂部。我知道我可以看看id陣列,並獲得每個文件的數據,但這會花費我10個查詢,而不是一個。

回答

1

我真的不知道你的問題。這裏有一些僞代碼:

// get last N download events 
events = get_latest_downloads() 

// retrieve associated file data 
file_array = get_all_file_info_by_events(events) 

display_data = [] 
for(e in events) { 
    data = find_file_info_in_the_array(file_array, e.file_id) 
    display_data.push(data) 
} 

// now display_data is contains full file info, sorted by download time. 
+0

但是,然後我必須對循環中的每個回合做數據庫查詢?我試圖避免這種情況,因爲MongoDB支持只有一個查詢的數組進行查詢。 –

+0

我已更新我的問題。希望現在更清楚。 @sergio tulentsev。 –

+0

獲得所有文件的信息後,您可以使用'events'數組中的順序來構建最終結果。 –