2011-09-18 129 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以观察朋友列表中的更改并将其非规范化。这具有将更新保持在一个地方并与您的其他代码完全分离的优点,并且保证您不会错过和更新。