gpt4 book ai didi

CouchDB View : Joins and Subqueries

转载 作者:行者123 更新时间:2023-12-04 07:11:46 24 4
gpt4 key购买 nike

我将此发布到 CouchDB-Users 邮件列表,但我认为我的网络范围更广一些。

[由于 stackoverflow 的新用户垃圾邮件规则,链接被破坏 :-( ]

希望你们中的一位聪明人可以提供帮助
(或者至少有人可以明确地告诉我我想要做的事情是不可能的,我会
必须寻找替代方案......我听说 MySQL 正在被采用 (-: )。

背景资料:
我在这里设置了一个示例数据库:scoates-test.couchone.com/_utils/database.html?follow
/scoates-test.couchone.com/follow

我有两种类型的文件。类型=用户和类型= Assets 。

示例用户:scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be05f67d

Assets 示例:scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be061d62

用户可以关注其他用户(type=user 文档的“关注”字段)。上面的例子
用户 (username=bob) 正在“关注”2 个用户:

"following": [
"c988a29740241c7d20fc7974be05ec54", // username=aaron
"c988a29740241c7d20fc7974be060bb4" // username=dale
]

Assets 由特定用户拥有。上面的示例 Assets 归 c988a29740241c7d20fc7974be061d62(用户名=bob)所有。

希望这是有道理的。

我想请求属于 bob 关注的用户(aaron 和 dale)的 Assets ,并且
我无法将手指放在允许这样做的 View 代码上。我可以轻松地发出所有 Assets
属于 c988a29740241c7d20fc7974be05f67d。

我可以在两个请求中做到这一点。首先,我会向 CouchDB 询问 c988a29740241c7d20fc7974be05f67d,
然后将以下内容作为“ key ”发布到返回属于这些 key 的 Assets 的 View 中,
但是你会注意到我的 type=asset 文档也有一个“when”字段,我希望能够
通过发出 [doc.owner, doc.when] 作为键,然后使用 startKey/endKey 来排序。
所以我认为 key 的 POST 已经过时了。

我可以在应用程序端加入(查询以下键,提出一个请求
这些键中的每一个,然后在应用程序端排序),但这真的很严重地破坏了分页(我会
需要为每个以下请求限制 pageSize),这非常失控
快速(如果用户关注 1000 个用户,则每页有 10,000 条记录)。

这些解决方案都不适合我。我想在 CouchDB 中做到这一点。

我真的很难过。请帮忙。

最佳答案

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

Querying a CouchDB view returns zero, one or more key-value-id tuples such that the key, value and id are computed from the same document. You may optionally ask for the document with the provided id (which may or may not be the document that was used to compute the tuple).



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

在您的特定情况下,您需要元组键包含:
  • 当前用户,因为您只希望该用户可以看到文档
  • 文档的“所有者”,因为您需要按该值排序。
  • 文档的“何时”,因为您需要按该值排序。

  • 根据基本规则,您需要一个 CouchDB 文档来包含所有这些。您当前的架构(“用户”文档中的当前用户和文档所有者,文档所有者和“文档”文档中的文档所有者)没有汇集所需的数据,因此您需要对其进行更改。

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

    { 
    owner : 'id-of-aaron',
    followers : [ 'id-of-bob', 'id-of-mike', 'id-of-melissa' ],
    docs : {
    'id-of-doc-1' : '2010-09-08',
    'id-of-doc-2' : '2010-09-07',
    'id-of-doc-3' : '2010-11-27'
    }
    }

    每当用户关注/取消关注所有者,或者所有者添加或删除文档时,您都需要更新此结构。从那里,您可以简单地发出:

    for (var docid in doc.docs) 
    for (var i in doc.followers) {
    emit ([doc.followers[i], doc.owner, doc.docs[docid]], { _id : docid });
    }
    }

    关于CouchDB View : Joins and Subqueries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4293171/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com