CouchDB Map函数 - 如何通过文档ID获取其他文档的数据

时间:2011-05-19 07:49:20

标签: join view couchdb

我在视图中“加入”某些文档时遇到问题。这是我的模式:类型为“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,但它们不显示地图功能。那么任何想法?

1 个答案:

答案 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循环来迭代这样的数组。