興味のある人のために、CouchDBの回答を投げたかっただけです。:)
上記の最初の回答で述べたように、著者ドキュメントを記事ドキュメントに埋め込むことは賢明ではないため、以下の例では、記事と著者の 2 つのドキュメント タイプを想定しています。
CouchDB は、通常 JavaScript で記述された MapReduce クエリを使用します (ただし、Python、Ruby、Erlang なども利用できます)。MapReduce クエリの結果は、最初のリクエスト時にインデックスに保存され、その保存されたインデックスはその後のすべてのルックアップに使用されます。データベースへの変更は、その後の要求に応じてインデックスに追加されます。
CouchDB の API は完全に HTTP ベースであるため、データベースへのすべてのリクエストは、さまざまな URL での HTTP 動詞 (GET、POST、PUT、DELETE) です。MapReduce クエリ (JavaScript で記述) と、インデックスから関連する結果を要求するために使用される URL の両方をリストします。
1. 著者と一緒に id で記事を取得する
これを行うための最も簡単な方法は、2 つの直接ドキュメント検索です。
/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} は著者の実際の 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);
}
}
?include_docs=true
ビュー リクエストを使用して、CouchDB にスタイルの「結合」を含めることができます。エミット (2 番目の引数) の値側に「_id」キーを含める場合、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 件の記事のリストが次のような形式で返されます。
{"行":[
{ "id":"article_id",
"キー":[2011, 9, 3, 12, 5, 41],
"value":{"_id":"author_id", "タイトル":"..."},
"doc":{"_id":"author_id", "名前":"著者名"}
}
]}
この同じインデックスを使用すると、著者データの有無にかかわらず、任意の年、月、日、時間などの粒度ですべてのドキュメントのリストを取得できます。
ビュー照合を使用して、複数のドキュメントを 1 つのドキュメントに集約する方法もあります (異種のコンテンツを参照する CMS のページのように)。7 月に CouchConf で行ったこれらのスライドに、その方法に関する情報がいくつかあります: http://www.slideshare.net/Couchbase/couchconfsfdesigningcouchbasedocuments
他にご不明な点がございましたら、お気軽にお問い合わせください。