CouchDB "Join" два документа - PullRequest
       31

CouchDB "Join" два документа

13 голосов
/ 17 июня 2011

У меня есть два документа, которые выглядят примерно так:

Doc
{
  _id: AAA,
  creator_id: ...,
  data: ...
}

DataKey
{
  _id: ...,
  credits_left: 500,
  times_used: 0,
  data_id: AAA
}

Я хочу создать представление, которое позволило бы мне передать идентификатор DataKey (key = DataKey _id) и получить информацию как DataKey, так и документа.

Моя попытка:

Сначала я попытался встроить DataKey внутри документа и использовал функцию карты следующим образом:

function (doc)
{
  if (doc.type == "Doc")
  {
    var ids = [];
    for (var i in doc.keys)
      ids.push(doc.keys[i]._id);

    emit(ids, doc);
  }
}

Но я столкнулся с двумя проблемами:

  1. Может быть несколько DataKey для Док, так что используя startkey = [idhere ...] и endkey = [idhere ..., {}] не работать (работал только если ключ случился быть первым в массиве).
  2. Все ключи данных должны быть уникальными, и я бы предпочел не создавать отдельный документ, такой как {_id = datakey}, чтобы зарезервировать ключ.

У кого-нибудь есть идеи, как мне это сделать? Дайте мне знать, если что-то неясно.

----- EDIT -----

Я забыл упомянуть, что в моем приложении я не знаю, что такое Doc ID, поэтому мне нужно иметь возможность искать по IDKey.

1 Ответ

11 голосов
/ 17 июня 2011

Я думаю, что вы хотите

function (doc)
{
  if (doc.type == "Doc")
  {
    emit([doc._id, 0], doc);
  }

  if(doc.type == "DataKey")
  {
    emit([doc.data_id, 1], doc);
  }
}

Теперь запросите представление с помощью key=["AAA"], и вы увидите список всех документов. Первым будет настоящий документ "Док". Все остальные будут документами «DataKey», которые ссылаются на первый документ.

Это распространенный метод, называемый CouchDB view collation .

...