Couchdb 按'排序发出的结果;人气';

Couchdb 按'排序发出的结果;人气';,couchdb,Couchdb,我目前正在使用couchdb获取用户信息。用户可以在我的网站上有朋友。 我想显示所有添加“我”为好友的人,按“某些用户”为好友的人数排序 简化的文档如下所示 { "_id": "some_id", "Name": "Some user", "lastMod": "1316300162", "aFriends": [ { "Name": Me", "More": "More info ... " },

我目前正在使用couchdb获取用户信息。用户可以在我的网站上有朋友。 我想显示所有添加“我”为好友的人,按“某些用户”为好友的人数排序

简化的文档如下所示

{
   "_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中有什么好的索引方法吗


Floor

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

要运行这种查询,您需要将用户的受欢迎程度反规范化到他们的文档中,并基于此进行排序。这有点复杂,因为您需要确保在用户的好友更改时保持值的更新

关于如何做到这一点,您有一些选择,但哪种选择最好取决于代码的结构

作为用户对象保存函数的一部分,可以重新规范化用户所有好友的值。这样做的优点是简单且可以立即更新值,但会降低保存速度,如果在多个位置保存用户,则会变得复杂

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


最后,您可以监视好友列表中的更改,并对其中的值进行非规范化。这样做的好处是将更新保存在一个地方,并与代码的其余部分完全分开,同时保证不会丢失和更新。

一旦进入图形查询,像CouchDB这样的文档存储可能不是合适的工具。你需要一个图形数据库。然而,对于这种类型的查询,即使是关系数据库也比coach更好。