Как получить данные других документов по идентификатору документа в функции карты - PullRequest
2 голосов
/ 19 мая 2011

У меня проблема с "соединением" некоторых документов в представлении.Вот моя схема: Документы с типом «категория» могут содержать встроенный массив идентификаторов документов с типом «страница».Оба имеют поле "имя".

Мои документы:

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

вместо PAGE_ID я хочу НАИМЕНОВАНИЕ ссылочного документа.Это в основном пример из вики CouchDB , но они не показывают функцию карты.Так есть идеи?

1 Ответ

4 голосов
/ 19 мая 2011

Вам нужно включить поле _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 к вашему URL. И ваш вывод представления добавит новое поле к каждой строке с именем doc. Обычно это поле содержит полный исходный документ. В этом случае он будет включать связанный документ, на который вы ссылаетесь.

РЕДАКТИРОВАТЬ Кстати, вы используете петлю for...in неправильно. for...in используется для зацикливания свойств объекта. Вам нужно использовать простой цикл for для итерации массива, подобного этому.

...