2011-09-18 176 views
1

我目前正在使用couchdb獲取用戶信息。用戶可以在我的網站上有朋友。 我想顯示所有已添加的「我」的朋友通過的有「some_user」作爲朋友按'流行'排序排序結果

簡化文件看起來像這樣

{ 
    "_id": "some_id", 
    "Name": "Some user", 
    "lastMod": "1316300162", 
    "aFriends": [ 
     { 
      "Name": Me", 
      "More": "More info ... " 
     }, 
     { 
      "Name": Friend1" 
      "More": "More info ... " 
     } 
    ] 
} 

我目前人量命人使用此視圖來顯示所有朋友

function(doc) { 
if(doc.aFriends.length > 0) { 
    for(var i in doc.aFriends) { 
     emit(doc.aFriends[i]['Name'],{UserName: doc.Name, More: doc.aFriends[i]['More']}); 
    } 
    } 
} 

但是,這只是按字母順序顯示名稱。我想以排名用戶爲好友的用戶數量來訂購它們。有沒有什麼好的方法在couchdb中編制索引?

+0

一旦你進入圖形查詢,像CouchDB這樣的文檔存儲可能不是正確的工具。你需要一個圖形數據庫。但是,即使是關係型數據庫,對於這種類型的查詢來說,也是比沙發更好的解決方案。 – Elad

回答

0

您不能直接在CouchDB中做到這一點,因爲你可以在一個文檔中一次只能運行。

要運行這種查詢,您需要將用戶的流行度非規範化到他們的文檔中,並基於此進行排序。這有點複雜,因爲您需要確保在用戶朋友更改時保持值更新。

關於如何做到這一點,您有幾個選擇,但最好取決於代碼的結構。

您可以將所有用戶的朋友的值重新歸一化爲用戶對象的保存功能的一部分。這具有簡單且即時更新值的優點,但會降低保存速度,並且如果將用戶保存在多個位置將會變得複雜。

您可以使用後臺任務處理系統(如Celery)更新該值。這與將其更新爲保存功能的一部分相似,但是您需要將即時更新與快速保存過程進行權衡。

最後,您可以監視_changes以觀察朋友列表中的更改並將其非規範化。這具有將更新保持在一個地方並與您的其他代碼完全分離的優點,並且保證您不會錯過和更新。