gpt4 book ai didi

nested - 从 CouchDB 检索分层/嵌套数据

转载 作者:行者123 更新时间:2023-12-04 10:21:11 27 4
gpt4 key购买 nike

我对 couchDB 还很陌生,甚至在阅读之后也是如此 (latest archive as now deleted) http://wiki.apache.org/couchdb/How_to_store_hierarchical_data (via ‘Store the full path to each node as an attribute in that node's document’)它仍然没有点击。

我希望将子项作为 UUID 数组进行跟踪,并将父项作为单个 UUID 进行跟踪,而不是使用 wiki 中描述的完整路径模式。我倾向于这种模式,所以我可以通过 children 在 children 数组中的位置来维持他们的顺序。

这是沙发上的一些示例文档,桶可以包含桶和项目,项目只能包含其他项目。 (为清楚起见,缩写 UUID):

{_id: 3944
name: "top level bucket with two items"
type: "bucket",
parent: null
children: [8989, 4839]
}
{_id: 8989
name: "second level item with no sub items"
type: "item"
parent: 3944
}
{
_id: 4839
name: "second level bucket with one item"
type: "bucket",
parent: 3944
children: [5694]
}
{
_id: 5694
name: "third level item (has one sub item)"
type: "item",
parent: 4839,
children: [5390]
}
{
_id: 5390
name: "fourth level item"
type: "item"
parent: 5694
}

是否可以通过 map 函数中的嵌入文档 ID 查找文档?
function(doc) {
if(doc.type == "bucket" || doc.type == "item")
emit(doc, null); // still working on my key value output structure
if(doc.children) {
for(var i in doc.children) {
// can i look up a document here using ids from the children array?
doc.children[i]; // psuedo code
emit(); // the retrieved document would be emitted here
}
}
}
}

在理想的世界中,最终的 JSON 输出看起来像这样。
{"_id":3944,
"name":"top level bucket with two items",
"type":"bucket",
"parent":"",
"children":[
{"_id":8989, "name":"second level item with no sub items", "type":"item", "parent":3944},
{"_id": 4839, "name":"second level bucket with one item", "type":"bucket", "parent":3944, "children":[
{"_id":5694", "name":"third level item (has one sub item)", "type":"item", "parent": 4839, "children":[
{"_id":5390, "name":"fourth level item", "type":"item", "parent":5694}
]}
]}
]
}

最佳答案

你能从 View 中输出树结构吗? 不。CouchDB View 查询返回一个值列表,除了列表之外没有办法让它们输出任何内容。因此,您必须处理返回给定存储桶的所有后代列表的映射。

但是,您可以插入 _list View 本身之后的后处理函数,将该列表转换回嵌套结构。如果您的值知道 _id,这是可能的。他们的 parent - 算法相当简单,如果它给你带来麻烦,请再问一个问题。

你能通过 map 函数中的 id 来抓取文档吗? 不可以。无法通过 CouchDB 中的标识符获取文档。请求必须来自应用程序,可以是标准 GET 的形式。在文档标识符上,或添加 include_docs=true到查看请求。

其技术原因非常简单:CouchDB 仅在文档​​更改时运行 map 功能。如果文档 A被允许获取文档 B , 那么当 B 时发出的数据将变为无效变化。

你能在不存储每个节点的父节点列表的情况下输出所有后代吗? 不会。CouchDB 映射函数为数据库中的每个文档发出一组键值 ID 对,因此键和 ID 之间的对应关系必须基于单个文档来确定。

如果您有四级树结构 A -> B -> C -> D但只让一个节点知道它的父子节点,那么上面的节点都不知道 DA 的后代,因此您将无法发出 D 的 ID使用基于 A 的 key 因此它将在输出中不可见。

所以,你有三个选择:

  • 仅获取三个级别(这是可能的,因为 B 知道 CA 的后代),并通过再次运行查询获取其他级别。
  • 以某种方式存储节点内每个节点的后代列表(这是成本高昂的)。
  • 存储节点内每个节点的父节点列表。
  • 关于nested - 从 CouchDB 检索分层/嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6129561/

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