按“受欢迎程度”排序发出的结果

时间:2011-09-18 15:33:03

标签: couchdb

我目前正在使用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中对此进行索引?

地板

1 个答案:

答案 0 :(得分:0)

您不能直接在CouchDB中执行此操作,因为您一次只能处理一个文档。

要运行此类查询,您需要将用户的流行度反规范化到其文档中并根据该类进行排序。这有点复杂,因为您需要确保在用户的朋友更改时保持更新值。

您可以选择如何执行此操作,但最好的选择取决于代码的结构。

您可以将所有用户朋友的值重新规范化,作为User对象的保存功能的一部分。这样做的好处是简单并且可以立即更新值,但它会减慢保存速度,如果您在多个地方保存用户将会很复杂。

您可以使用后台任务处理系统(如Celery)来更新值。这类似于将其作为保存功能的一部分进行更新,但您可以通过更快的保存流程来更新即时更新。

最后,您可以监控_changes以观察好友列表中的更改并对其中的值进行非规范化。这样做的好处是可以将更新保存在一个位置,并完全与代码的其余部分分开,并保证您不会错过和更新。