CouchDB视图:联接和子查询
我把这个贴在CouchDB用户的邮件列表上,但我想我应该把我的网络撒得更广一些 [由于stackoverflow的新用户垃圾邮件规则,链接被破坏:-(] 希望你们中的一个聪明人能帮上忙 (或者至少有人能明确地告诉我我想做的事情是不可能的,我会 我必须寻找替代方案……我听说MySQL正在被采用(-:) 背景资料: 我已经在这里建立了一个示例数据库:scoates test.couchone.com/_utils/database.html?遵循 /scoates-test.couchone.com/follow 我有两种类型的文档。类型=用户,类型=资产 示例用户:scoates test.couchone.com/_-utils/document.html?follow/c988a29740241c7d20fc7974be05f67d 资产示例:scoates test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be061d62 用户可以跟随其他用户(type=用户文档的“following”字段) 用户(username=bob)是“以下”2个用户:CouchDB视图:联接和子查询,couchdb,Couchdb,我把这个贴在CouchDB用户的邮件列表上,但我想我应该把我的网络撒得更广一些 [由于stackoverflow的新用户垃圾邮件规则,链接被破坏:-(] 希望你们中的一个聪明人能帮上忙 (或者至少有人能明确地告诉我我想做的事情是不可能的,我会 我必须寻找替代方案……我听说MySQL正在被采用(-:) 背景资料: 我已经在这里建立了一个示例数据库:scoates test.couchone.com/_utils/database.html?遵循 /scoates-test.couchone.com
“以下内容”:[
“c988a29740241c7d20fc7974be05ec54”,//用户名=aaron
“c988a29740241c7d20fc7974be060bb4”//username=dale
]
资产由特定用户拥有。上述示例资产由c988a29740241c7d20fc7974be061d62(用户名=bob)拥有
希望这是有道理的
我想请求属于bob正在跟踪的用户(aaron和dale)的资产,以及
我不能把我的手指放在允许这样做的视图代码上。我可以轻松地发出所有允许这样做的资产
属于c988a29740241c7d20fc7974be05f67d
我可以在两个请求中完成。首先,我要向CouchDB索要c988a29740241c7d20fc7974be05f67d,
然后将以下内容作为“键”发布到返回属于这些键的资产的视图中,
但您会注意到,我的type=asset文档也有一个“when”字段,我希望能够
通过发出[doc.owner,doc.when]作为键,然后使用startKey/endKey来进行订购。
所以,我想钥匙的位置已经出来了
我可以在应用程序端加入(查询以下键,请求
这些键中的每一个,然后在应用程序端进行排序),但这严重破坏了分页(我认为
需要为每一个页面请求一个页面大小限制),这会非常失控
快速(如果一个用户跟踪1000个用户,即每页10000条记录)
这两种解决方案都不适合我,我想在CouchDB中使用
我真的被难住了,请帮帮我
SCouchDB视图有一个基本规则,可以帮助您解决此类问题 查询CouchDB视图将返回零个、一个或多个键值id元组,以便从同一文档计算键值、值和id。您可以选择请求具有所提供id的文档(该文档可能是用于计算元组的文档,也可能不是用于计算元组的文档) 仔细想想,这是相当合乎逻辑的:每个元组都是
emit()
的结果,因此所有发出的数据只能来自单个文档
在您的特定情况下,需要元组键包含:
- 当前用户,因为您只希望该用户可以看到文档
- 文档的“所有者”,因为您需要按该值排序
- 文档是“when”,因为您需要按该值排序
{
所有者:“亚伦的身份证”,
追随者:[“鲍勃的身份”、“迈克的身份”、“梅丽莎的身份”],
文件:{
“id-of-doc-1”:“2010-09-08”,
“id-of-doc-2”:“2010-09-07”,
“id-of-doc-3”:“2010-11-27”
}
}
每当用户跟随/取消跟随所有者,或所有者添加或删除文档时,您都需要更新此结构。从那里,您只需发出:
for(doc.docs中的var docid)
用于(文档跟随者中的变量i){
emit([doc.followers[i],doc.owner,doc.docs[docid]],{u id:docid});
}
}
感谢您的回复。我会对此进行思考。如果它符合我的需要,我会回来接受您的回答。如果不符合,我会回来问一些后续问题(:谢谢!这很有效。我真的很感谢你抽出时间给我一个好的解决方案。如果你也能看看我的后续问题,那就太好了。谢谢!