2011-12-10 65 views
1

這個問題在很大程度上是一個健全的檢查。我通過一系列故事和一系列用戶組織了一個數據庫。每個故事都有一系列對這個對象進行投票的「選民」。每個用戶也有一系列'朋友'。我想要做的只是搜索我的朋友們投票過的故事,另外還能夠根據投票該項目的朋友數量來排序。在MongoDB中,如何查詢僅包含數組字段中包含用戶名的故事的故事集合?

我最初的想法是這樣的:索引Story對象中選民的領域。然後,使用用戶文檔中的「朋友」數組,通過分組函數來計算每個故事顯示的次數,然後針對此索引的投票人字段中的故事進行地圖縮小查詢?不知道這是否正確..我也不確定這是否會縮放..思考和建議表示讚賞。

回答

1

我認爲你應該使用一個定期運行的M/R查詢和存儲集合中的結果後臺工作,您可以查詢很容易,如

TopStories { 
    "UserId" : ObjectId("..."), 
    "List" : [ 
       { "TotalVotes" : 200, 
       "FriendVotes" : 28, 
       "StoryName" : "test", 
       "StoryId" : ObjectId('...') 
       }, 
       { 
       /* etc. */ } 
       } 
      ] 
} 

這是微不足道的查詢,但不是很靈活。更靈活的結構,避免了嵌入的列表:

TopStory { 
    "UserId": ObjectId("..."), 
    "StoryId" : ObjectId("..."), 
    "StoryName" : "foo", 
    "FriendVotes" : 28, 
    "TotalVotes" : 200 
    // etc. 
} 

後者可用於通過總的投票數來排序爲好,例如。

M/R曾經是'大錘子',它不應該從網絡前端或任何其他實時運行。有計劃改善這一點,但我不知道目前的狀態,所以我會安全地玩。我也相信,如果你的收藏品增長很多,這個M/R工作將不會很快,如果不是幾分鐘而不是幾毫秒,那麼預計它會以幾十秒的順序運行。

+0

謝謝你的答案,它似乎是一個計算複雜的問題,不能很好地擴展。你認爲使用其他數據庫系統可以更容易地解決這樣的問題嗎? – Inc1982

+0

np。是的,我認爲這是一個高度關係問題,所以RDBMS會更容易。 RDBMS善於「發現」可以優化的關係:例如,在這種情況下,使用這組朋友計算交叉點並進行排序。我不知道哪個更好。問題是你是否想使用兩個不同的數據庫系統... – mnemosyn

相關問題