开发者

How to get other documents' data by document id in map function

I have a problem "joining" some documents in a view. Here's my schema: Documents with type "category" can hold an embedded array of ids to documents with type "page". Both have a field "name".

My Documents:

{
   "_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"
}

Now I want to join these in a view with this map function:

function(doc) {
  if (doc.TYPE == "category") {
    for (id in doc.PAGES) {
      emit(doc.NAME, doc.PAGES[id].PAGE_ID);
    }
  }
}

But instead of the PAGE_ID I want the NAME of the referencing document. This is basically the example from the CouchDB wiki, but they don't sh开发者_如何学Cow the map function. So any ideas?


You need to include a _id field somewhere in your output value. After that, you use include_docs=true and the view will include the linked document instead of the source document. For example:

function(doc) {
   if (doc.TYPE == "category") {
      for (var x = 0; x < doc.PAGES.length; x++) {
         emit(doc.NAME, { _id: doc.PAGES[x].PAGE_ID });
      }
   }
}

When you query this view, you add include_docs=true to your URL. And your view output will add a new field to each row called doc. Ordinarily, that field will contain the full source document. In this case, it will include the linked document you are referring to.

EDIT Btw, you're using the for...in loop incorrectly. A for...in is used to loop over the properties of an object. You need to use a simple for loop to iterate an array like this.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜