Просто хотел добавить ответ CouchDB для всех, кому это может быть интересно. :)
Как уже упоминалось в первом ответе выше, встраивание документа автора в документ статьи неразумно, поэтому в приведенных ниже примерах допускается два типа документов: статьи и авторы.
CouchDB использует запросы MapReduce, обычно написанные на JavaScript (но доступны Python, Ruby, Erlang и другие). Результаты запроса MapReduce сохраняются в индексе по их первому запросу, и этот сохраненный индекс используется для всех будущих поисков. Изменения в базе данных добавляются в индекс при последующих запросах.
API CouchDB полностью основан на HTTP, поэтому все запросы к базе данных являются HTTP-глаголами (GET, POST, PUT, DELETE) по различным URL-адресам. Я перечислю оба запроса MapReduce (написанные на JavaScript) вместе с URL-адресом, используемым для запроса связанных результатов из индекса.
1. Получить статью по идентификатору вместе с автором
Самый простой способ сделать это - два прямых поиска документов:
GET /db/{article_id}
GET /db/{author_id}
... где {author_id} - значение, полученное из поля author_id статьи.
2. Получить все статьи конкретного автора
MapReduce
function (doc) {
if (doc.type === 'article') {
emit(doc.author_id, doc);
}
}
GET /db/_design/cms/_view/articles_by_author?key="{author_id}"
... где {author_id} - фактический идентификатор автора.
3. Найдите первые 10 статей с авторами, отсортированными по дате создания
MapReduce
function (doc) {
function arrayDateFromTimeStamp(ts) {
var d = new Date(ts);
return [d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds()];
}
var newdoc = doc;
newdoc._id = doc.author_id;
newdoc.created_at = arrayDateFromTimeStamp(doc.created_at);
if (doc.type === 'article') {
emit(newdoc.created_at, newdoc);
}
}
Возможно включить стиль "соединения" в CouchDB, используя ?include_docs=true
в запросе на просмотр. Если вы добавите ключ «_id» в значение стороны emit (второй аргумент), то добавление include_docs=true
к параметрам вашего запроса будет включать документ, на который ссылается указанный «_id». В приведенном выше случае мы заменяем собственный «_id» документа (который нам больше не нужен) с указанным автором «_id» (значение «author_id» в документе статьи). Запрос 10 лучших статей с информацией об авторе выглядит следующим образом:
GET /db/_design/cms/_view/articles_by_date?descending=true&limit=10&include_docs=true
Запрос этого URL вернет список 10 последних статей в формате, подобном:
{"rows":[
{ "id":"article_id",
"key":[2011, 9, 3, 12, 5, 41],
"value":{"_id":"author_id", "title":"..."},
"doc":{"_id":"author_id", "name":"Author Name"}
}
]}
Используя этот же индекс, вы можете получить список всех документов за любой год, месяц, день, час и т. Д. С данными автора или без него.
Существуют также методы использования сопоставления представлений для объединения нескольких документов из одного документа (например, страницы в CMS, ссылающейся на разнородный контент). Есть некоторая информация о том, как сделать это на этих слайдах, которые я сделал для CouchConf в июле: http://www.slideshare.net/Couchbase/couchconfsfdesigningcouchbasedocuments
Если у вас есть другие вопросы, пожалуйста, дайте мне знать.