2 つのドキュメント「タイプ」があります:PostとUser:
典型的な投稿:
{
"_id": "3847345345",
"Schema": "Post",
"Text": "Hello World! This is a post!",
"IsFeatured": true,
"UserID": "12345345345234234"
}
一般的なユーザー:
{
"_id": "12345345345234234",
"Schema": "User",
"Username": "georgepowell"
"PostIds": ["3847345345","5135345345","9987453236", ... ]
}
を表示する Web ページでは、PostそのUsername投稿 (およびそのユーザーに関するその他の変更可能な情報) の が投稿の横に表示されます。SOに似ています:

これは、SQL JOIN が最適な状況の典型的な例ですが、もちろん CouchDB はそのようなものをサポートしていません。User代わりに、ドキュメントとPostaPostのドキュメントの両方にインデックスを付けるビューを作成できます_id。このような:
function(doc) {
if (doc.Schema = 'Post') {
emit([doc._id, 0], null);
} else if (doc.Schema = 'User') {
foreach (string id in doc.PostIds) // not javascript I know. shhh
emit([id, 1], null);
}
}
Post単一のが与えられた場合、必要なすべての情報を効率的に取得できるため、これはうまく機能します_id。
ただし、すべての投稿とすべてのユーザー データを一覧表示するビューを作成したい場合は、IsFeatured == true行き詰まります。
function(doc) {
if (doc.Schema = 'Post' && doc.IsFeatured) {
emit([doc._id, 0], null);
} else if (doc.Schema = 'User') {
foreach (string id in doc.PostIds)
emit([id, 1], null); // I can't check if the post is featured!
}
}
リレーショナル データの CouchDB の制限に達しましたか? または、CouchDBでこの種のインデックス作成は可能ですか?