CouchDB博客应用程序

时间:2011-03-27 14:08:27

标签: couchdb

我已经阅读了“CouchDB - 权威指南”以及网上发现的许多文章。 我已经理解了Couch的工作方式,但仍有一些问题在我脑海中。

假设使用简单的博客应用程序: 在帖子页面中,我想要显示帖子的数据和作者的数据。 所以我想我必须将所有内容放在同一个文件中。 好。 如果我只需要在一个页面中显示作者的数据,我可以用视图来完成。 确定。

但如果作者更新了他的数据,我需要更新作者出现的每个文件吗? 或者我错了吗?

我真的很想理解这种逻辑。

提前致谢。

2 个答案:

答案 0 :(得分:8)

某些信息可以保留在同一文档中,在大多数情况下,这些信息都可以正常使用。

{
    "title": "Blog Article Title",
    "content": "... blah blah blah ...",
    "author": {
        "name": "someguy",
        "email": "someguy@foo.bar"
    },
    "type": "post"
}

其他时候您可以使用其他文档的_id来创建2个文档之间的链接。

{
    "_id": "...",
    "title": "Blog Article Title",
    "content": "... blah blah blah ...",
    "author": "someguy",
    "type": "post"
}

{
    "_id": "someguy",
    "name": "Some Guy",
    "email": "someguy@foo.bar",
    "type": "author"
}

乍一看,您需要2个单独的查询才能检索这两个实体。但是,有一个很好的小技巧,查看查询可以公开。

function (doc) {
    if (doc.type === "post") {
        emit([doc.title, 0], null);                // output the main post
        emit([doc.title, 1], { _id: doc.author }); // output the author
    }
}

您的视图将输出以下结果:(注意视图的排序方式)

{ ...
    "rows": [
        {
            "key": ["Blog Article Title", 0],
            "value": null
        },
        {
            "key": ["Blog Article Title", 1],
            "value": { "_id": "someguy" }
        }
    ]
}

这并不是那么有用,但如果您将include_docs=true添加到您的视图网址,您将获得以下结果:

{ ...
    "rows": [
        {
            "key": ["Blog Article Title", 0],
            "value": null,
            "doc": {
                "_id": "...",
                "title": "Blog Article Title",
                "content": "... blah blah blah ...",
                "author": "someguy",
                "type": "post"
            },
        },
        {
            "key": ["Blog Article Title", 1],
            "value": { "_id": "someguy" },
            "doc": {
                "_id": "someguy",
                "name": "Some Guy",
                "email": "someguy@foo.bar",
                "type": "author"
            }
        }
    ]
}

现在两个实体都包含在1个查询中。 :)

查看this article以获取有关CouchDB中实体关系的更多信息。

答案 1 :(得分:3)

是的,您需要更新每个文档。这个想法是很罕见的大更新,所以即使它们的计算成本很高,你也不必做很多。