В CouchDB вы должны написать карту / уменьшить, которая выведет ВСЕ автомобили и водителей со сложными ключами, а затем использовать диапазоны клавиш, чтобы выбрать оба. Например, давайте предположим, что ваши документы выглядят как эти два ...
{
"_id": "...",
"_rev": "...",
"docType": "driver"
}
{
"_id": "...",
"_rev": "...",
"docType": "car",
"driver": "driver's _id"
}
Вы можете использовать duck, набрав вместо указания docType, но мне этот метод больше нравится.
Ваша функция карты:
function(doc)
{
if(doc.docType == "driver")
emit([doc.id, 0], doc);
elseif(doc.docType == "car")
emit([doc.driver, 1], doc];
}
Наш сложный ключ является массивом, причем первым элементом всегда является _id драйвера. Второй элемент в массиве предотвращает столкновение ключей и позволяет напрямую ссылаться на автомобиль или водителя (подробнее об этом позже).
Теперь мы можем использовать параметры запроса диапазона ключей для получения обеих документов.
?startkey=["driver _id"]&endkey=["driver _id", {}]
Это в основном говорит: «Дайте мне любой массив с драйвером _id в качестве первого элемента и что угодно во втором. Это работает, потому что объекты - второй элемент в массиве endkey
- отсортированы как самые высокие. http://wiki.apache.org/couchdb/View_collation?redirect=ViewCollation#Collation_Specification для получения дополнительной информации о том, как элементы сортируются / взвешиваются в ключах.
Это также очень хорошо масштабируется, потому что мы можем добавить больше информации в нашу функцию карты без необходимости изменять наш запрос в клиенте. Допустим, мы добавляем спонсорский docType: мы просто добавляем еще один elseif
для поля docType и затем emit([doc.driver, 2], doc);
. Теперь мы можем получить все три документа в одном запросе с одним и тем же запросом диапазона ключей сверху.
Конечно, вы также можете указать отдельные документы вместо того, чтобы извлекать их все. ?key=["driver's _id", 1]
будет тянуть только машину для указанного водителя.
Приветствие.