CouchDB视图:联接和子查询

CouchDB视图:联接和子查询,couchdb,Couchdb,我把这个贴在CouchDB用户的邮件列表上,但我想我应该把我的网络撒得更广一些 [由于stackoverflow的新用户垃圾邮件规则,链接被破坏:-(] 希望你们中的一个聪明人能帮上忙 (或者至少有人能明确地告诉我我想做的事情是不可能的,我会 我必须寻找替代方案……我听说MySQL正在被采用(-:) 背景资料: 我已经在这里建立了一个示例数据库:scoates test.couchone.com/_utils/database.html?遵循 /scoates-test.couchone.com

我把这个贴在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个用户:

“以下内容”:[
“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中使用

我真的被难住了,请帮帮我


S

CouchDB视图有一个基本规则,可以帮助您解决此类问题

查询CouchDB视图将返回零个、一个或多个键值id元组,以便从同一文档计算键值、值和id。您可以选择请求具有所提供id的文档(该文档可能是用于计算元组的文档,也可能不是用于计算元组的文档)

仔细想想,这是相当合乎逻辑的:每个元组都是
emit()
的结果,因此所有发出的数据只能来自单个文档

在您的特定情况下,需要元组键包含:

  • 当前用户,因为您只希望该用户可以看到文档
  • 文档的“所有者”,因为您需要按该值排序
  • 文档是“when”,因为您需要按该值排序
根据基本规则,您需要一个CouchDB文档来包含所有这些内容。您当前的模式(用户文档中的当前用户和文档所有者、“文档”文档中的当前用户和文档所有者以及文档所有者)没有汇集所需的数据,因此需要对其进行更改

我的建议是使用具有以下结构的“共享”文件:

{
所有者:“亚伦的身份证”,
追随者:[“鲍勃的身份”、“迈克的身份”、“梅丽莎的身份”],
文件:{
“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});
}
}

感谢您的回复。我会对此进行思考。如果它符合我的需要,我会回来接受您的回答。如果不符合,我会回来问一些后续问题(:谢谢!这很有效。我真的很感谢你抽出时间给我一个好的解决方案。如果你也能看看我的后续问题,那就太好了。谢谢!