CouchDB-参数和视图-幕后发生了什么,它比临时视图快/快吗?

CouchDB-参数和视图-幕后发生了什么,它比临时视图快/快吗?,couchdb,Couchdb,考虑到这三份文件 [ { _id: "...", _rev: "...", title: "Foo", body: "..." }, { _id: "...", _rev: "...", title: "Bar", body: "..." }, { _id: "...", _rev: "...",

考虑到这三份文件

[
    {
        _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"

最近我问了一些关于观点的问题。。。关于我所说的“动态参数”的问题。。。本质上,我想知道如何做
SELECT。。。其中字段=参数


所有的答案都引导我使用临时视图,这非常缓慢,不应该在生产中使用。所以我的第二个问题是上述按标题查询的方法是否适合在生产中使用?还是我在强迫CouchDB做无法形容的恐怖表演?。。。我基本上是在使用临时视图吗?

我想你误解了一些答案。您可以使用临时视图来测试各种map/reduce函数。当您对代码感到满意时,应该将其放入设计文档中并使用它进行查询

临时视图速度较慢,因为每个查询都会生成和删除索引。将其放入设计文档中,告诉CouchDB不要删除索引并保持其更新(这在查询时完成)

所以

是按标题查询的最快方式,因为它已编制索引

作为旁注:您可以使用

byTitle: {
    map: function (document)
    {
        emit(document.title, null);
    }
}

为了节省一些磁盘空间。

为了回答您的问题,必须清除一些内容(我希望我能处理好):

永久视图与临时视图: 永久视图和临时视图的区别在于,永久视图是永久存储的

为了理解存储部分,您需要知道,CouchDB的存储引擎依赖于一个B+树,它提供了非常强大的索引功能,使我们能够在“对数摊销时间”(对数摊销时间)内按键查找存储中的数据

CouchDB以“仅附加”的方式处理文档。这意味着它不像大多数关系型DBMS中的表行中的单个值得到更新并发生锁定。如果文档被更新,它只是以增量方式被设置为一个新版本(_rev)并附加到存储器中

创建永久视图时,在第一次查询时,将为数据库中的每个文档执行新视图,并将该数据存储到该视图的新B+树文件中,从而根据视图中定义的键提供新索引来聚合数据

在更新由该视图处理的文档时,不需要重新计算整个永久视图,只需要重新计算更新的文档

现在,您应该能够理解为什么临时视图适合在Futon中开发或测试,但由于它们必须计算为所有文档的新视图,因此不建议您将其用于开发之外的任何其他用途

无论如何。马塞洛是对的。如果您只想传回完整的文档,建议您使用“include_docs=true”进行查询。为什么?因为永久视图的B树只需要将复制的数据存储在索引键旁边


@Marcello Nuccio我不确定,尽管说动态视图没有索引是否正确?据我所知,它们有一个索引,但这毫无意义,因为它们是在每次查询时新计算的?好了,现在我的布莱恩受伤了

所以在你的建议中,CouchDB会为我所有的文档标题创建一个索引?在所有情况下,索引都是从每个文档创建并完全建立起来的。所有视图查询都必须是针对索引的查询。但是,对于临时视图,整个索引将在HTTP查询之后被删除。@jhs:你说得对。我认为更清楚的说法是没有索引,因为从用户的角度来看,这就像查询一个没有索引的视图。我已经编辑了我的答案,希望现在更好。谢谢。是的,临时视图有索引,但只使用一次。我说过没有什么可以避免任何混乱:为每个请求构建就像没有它一样。不过,我会尝试修正我的答案。
byTitle: {
    map: function (document)
    {
        emit(document.title, null);
    }
}