考虑这三个文件......
[
{
_id: "...",
_rev: "...",
title: "Foo",
body: "..."
},
{
_id: "...",
_rev: "...",
title: "Bar",
body: "..."
},
{
_id: "...",
_rev: "...",
title: "Hello World!",
body: "..."
},
]
这个观点......
byTitle: {
map: function (document)
{
emit(document.title, document);
}
}
当我查询视图时,幕后会发生什么?...
GET /database/_design/posts/_view/byTitle?key="Foo"
我最近询问了一些关于观点的问题...关于我所说的“动态参数”的问题 ...基本上我想知道如何做等同于{{1 }}
所有答案都引导我使用临时视图,这些视图非常慢,不应该用于制作。所以我的第二个问题是...... 是按标题查询的上述方法,适合在生产中使用?或者我是否迫使CouchDB在性能方面做出无法形容的恐怖?...我基本上和使用临时视图一样吗?
答案 0 :(得分:6)
我认为你误解了一些答案。您可以使用临时视图来测试各种map / reduce函数。如果您对代码感到满意,则应将其放入设计文档中并使用它进行查询。
临时视图很慢,因为为每个查询构建和删除了索引。将它放入设计文档中,告诉CouchDB不要删除索引并保持更新(这是在查询时完成的。)
所以
GET /database/_design/posts/_view/byTitle?key="Foo"
是按标题查询的最快方式,因为它已被编入索引。
作为旁注:您可以使用
byTitle: {
map: function (document)
{
emit(document.title, null);
}
}
和query with include_docs=true
以节省一些磁盘空间。
答案 1 :(得分:2)
为了回答你的问题,必须清除一些事情(我希望我能做好):
永久与临时观点: 永久视图和临时视图之间的区别在于,永久视图是永久存储的。
为了理解存储部分,您需要知道,CouchDB的存储引擎依赖于B + Tree,它提供了非常强大的索引功能,使我们能够在“对数摊销时间”中通过密钥查找该存储中的数据({ {3}})。
CouchDB以“仅附加”方式处理文档。这意味着它不像在最关系的DBMS中那样,表行中的单个值得到更新并发生锁定。如果文档被更新,它只是递增地设置一个新版本(_rev)并附加到存储。
当您创建永久视图时,在第一次查询时,对于数据库中的每个文档,将执行新视图,将该数据存储到该视图的新B +树文件中,从而为该视图提供新索引根据您在视图中定义的键聚合数据。
在更新由该视图处理的文档时,不需要重新计算整个永久视图,而只需要重新计算更新的文档。
现在你应该能够理解为什么临时视图适合在Futon中开发或测试,但是因为必须为所有文档计算新的,所以不推荐用于开发以外的任何其他文件。
反正。马塞洛是对的。如果您打算只传回完整的文档,建议使用“include_docs = true”进行查询。为什么?因为永久视图的B树只需要将复制的数据存储在索引键旁边。
@ Marcello-Nuccio我不确定虽然说动态视图没有索引是否正确?据我所知,他们有一个索引,但它没有任何意义,因为它们是在每次查询时计算的新东西?好吧,现在我的brbain受伤了!