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.
Ответы
Ответ 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 просмотреть сортировку.