我目前正在使用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 :(得分:0)
您不能直接在CouchDB中执行此操作,因为您一次只能处理一个文档。
要运行此类查询,您需要将用户的流行度反规范化到其文档中并根据该类进行排序。这有点复杂,因为您需要确保在用户的朋友更改时保持更新值。
您可以选择如何执行此操作,但最好的选择取决于代码的结构。
您可以将所有用户朋友的值重新规范化,作为User对象的保存功能的一部分。这样做的好处是简单并且可以立即更新值,但它会减慢保存速度,如果您在多个地方保存用户将会很复杂。
您可以使用后台任务处理系统(如Celery)来更新值。这类似于将其作为保存功能的一部分进行更新,但您可以通过更快的保存流程来更新即时更新。
最后,您可以监控_changes以观察好友列表中的更改并对其中的值进行非规范化。这样做的好处是可以将更新保存在一个位置,并完全与代码的其余部分分开,并保证您不会错过和更新。