Подтвердить что ты не робот

CouchDB "Присоединиться" к двум документам

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

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

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

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

Моя попытка:

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

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

    emit(ids, doc);
  }
}

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

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

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

----- ----- РЕДАКТИРОВАТЬ

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

4b9b3361

Ответ 1

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

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

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

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

Это обычная техника, называемая CouchDB просмотреть сортировку.