gpt4 book ai didi

json - 如何在 couchdb View 中调用另一个 View ?

转载 作者:行者123 更新时间:2023-12-04 17:41:15 24 4
gpt4 key购买 nike

我刚刚完成了“couchdb:权威指南”一书,并开始使用设计文档。然而有一件事,我不明白。到目前为止,我看到的所有示例都有些线性。

示例:

{
"_id": "1",
"_rev": ".....",
"name": "first",
"something": "blue",
"child": "2"
}

{
"_id": "2",
"_rev": ".....",
"name": "second",
"something": "green",
"child": "3"
"parent" : "1"
}

{
"_id": "3",
"_rev": ".....",
"name": "second",
"something": "red",
"parent" : "2";
}

我写一个 View 没有问题,它返回所有颜色:
function(doc) {
if (doc.something) {
emit(doc.something,doc._id);
}
}

但是,如果我想知道 _id = 1 ("something": "blue") 元素的所有 (!) 后代( 不是 child ,对不起我的错误 )怎么办?我的编程经验告诉我,我应该使用递归,但我不知道如何使用。如何从 View 函数调用另一个 View 函数?

一般来说:当你设计一个在json文档之间有引用的数据库时,就会出现这个问题。更具体地说,是元素之间的传递关系。

编辑:
例如:我只知道 _id=1,结果应该是 [_id=2, _id=3],因为 2 是 1 的 child ,3 是 2 的 child 。

最佳答案

如果可能的话,不要以这种方式定义文档层次结构——您将在每一步都与 CouchDB 进行斗争。

您无法真正在 View 中进行层次结构遍历。 View 用于在其他文档( map )上独立传输每个文档并从中生成一些聚合值(减少)。

您可以使用列表同时对多个文档进行操作,但这也不是一个好的解决方案。

如果您需要保留此数据结构(指向父/子的链接),我建议您从 CouchDB 外部组装结构:获取父文档、获取其子文档、获取其子文档等。

但是,在 CouchDB 中存储树的首选方法是让每个节点记住它在树中的路径:

{
"_id": "1",
"name": "first",
"something": "blue",
"path": [1]
}

{
"_id": "2",
"name": "second",
"something": "green",
"path": [1,2]
}

{
"_id": "3",
"name": "second",
"something": "red",
"path": [1,2,3]
}

然后,您可以使用此 View 获取文档的后代:
function(doc) { 
for (var i in doc.path) {
emit([doc.path[i], doc.path], doc)
}
}

获取 _id的后代1 您可以运行此查询:
http://c.com/db/_design/colors/_view/descendants?startkey=[1]&endkey=[1,{}]

但是,存储完整路径也有其自身的缺点。我建议你检查这个 CouchDB wiki page on trees .其来源是 this blog post by Paul Bonser .

关于json - 如何在 couchdb View 中调用另一个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3365268/

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