我在视图中“加入”某些文档时遇到问题。这是我的模式:类型为“category”的文档可以将一个嵌入的id数组保存到类型为“page”的文档中。两者都有一个字段“名称”。
我的文件:
{
"_id": "887c28dcf6dd8429d404d276b900b203",
"_rev": "3-c4d1e0c8378bb0081b5fe3522ee649a0",
"TYPE": "category",
"NAME": "Home",
"PAGES": [
{"PAGE_ID": "887c28dcf6dd8429d404d276b900ad8f"},
{"PAGE_ID": "887c28dcf6dd8429d404d276b900b203"},
{"PAGE_ID": "887c28dcf6dd8429d404d276b900bae0"}
]
}
{
"_id": "887c28dcf6dd8429d404d276b9008c01",
"_rev": "1-afd54c654ae5afa56a3fbd7b1ba119d2",
"TYPE": "page",
"NAME": "Foo"
}
现在我想在这个地图功能的视图中加入这些:
function(doc) {
if (doc.TYPE == "category") {
for (id in doc.PAGES) {
emit(doc.NAME, doc.PAGES[id].PAGE_ID);
}
}
}
但是我想要引用文档的NAME而不是PAGE_ID。 这基本上是the example from the CouchDB wiki,但它们不显示地图功能。那么任何想法?
答案 0 :(得分:4)
您需要在输出值的某处包含_id
字段。之后,使用include_docs=true
,视图将包含链接文档而不是源文档。例如:
function(doc) {
if (doc.TYPE == "category") {
for (var x = 0; x < doc.PAGES.length; x++) {
emit(doc.NAME, { _id: doc.PAGES[x].PAGE_ID });
}
}
}
当您查询此视图时,您会在网址中添加include_docs=true
。您的视图输出将向称为doc
的每一行添加一个新字段。通常,该字段将包含完整的源文档。在这种情况下,它将包含您所指的链接文档。
编辑顺便说一句,您错误地使用了for...in
循环。 for...in
用于循环对象的属性。您需要使用简单的for
循环来迭代这样的数组。