我已经阅读了“CouchDB - 权威指南”以及网上发现的许多文章。 我已经理解了Couch的工作方式,但仍有一些问题在我脑海中。
假设使用简单的博客应用程序: 在帖子页面中,我想要显示帖子的数据和作者的数据。 所以我想我必须将所有内容放在同一个文件中。 好。 如果我只需要在一个页面中显示作者的数据,我可以用视图来完成。 确定。
但如果作者更新了他的数据,我需要更新作者出现的每个文件吗? 或者我错了吗?
我真的很想理解这种逻辑。
提前致谢。
答案 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)
是的,您需要更新每个文档。这个想法是很罕见的大更新,所以即使它们的计算成本很高,你也不必做很多。