我们有两种文档“类型”: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", ... ]
}
在显示 的网页上,Post
该Username
帖子的 (以及有关该用户的任何其他可变信息)显示在帖子旁边。类似于 SO:
这是一个典型的例子,说明 SQL JOIN 是完美的,但当然 CouchDB 不支持这样的事情。相反,我们可以创建一个视图来索引User
文档和'sPost
上的文档。像这样:Post
_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
's所需的所有信息_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 中是否可行?