为什么 CouchDB 文档建议不应在视图中发出文档?

Why is the CouchDB documentation suggesting docs should not be emitted in the view?

在CouchDB官方文档的View Collat​​ion章节第一个例子(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-collation)中,建议不要在视图中发出文档本身,而是建议通过使用 ?include_docs=true.

请求视图,在请求视图时包含文档的正文

如果我没理解错的话,而不是:

emit(doc._id, doc);

并获得以下格式的结果:

{"id":"1","key":"1","value":{"_id": "1", "someProp": "someVal"}},

建议发送带有空值的发射:

emit(doc._id, null)

然后当使用 include_docs 参数查询我的视图时,得到以下格式的结果:

{
    "id": "1",
    "key": "1",
    "value": null,
    "doc": {
        "_id": "1",
        "_rev": "1-0eee81fecb5aa4f51e285c621271ff02",
        "someProp": "someVal"
}

如果有人建议,我认为它的性能会更好,但不幸的是,文档没有详细说明为什么和其他示例通常将文档作为 emit 中的值发出。谁能对此有更多的了解?

当您 emit 整个文档在一个视图中时,实际上是在磁盘上复制该文档。这是因为每个视图都有自己的文件,其中包含 运行 数据库视图的结果。因此,如果您有 3 个输出文档的视图,则有 4 个副本浮动。 (不算文档的多次修改,这当然会增加更多的重复)

CouchDB 非常自由地使用 disk-space 以使写入发生得更快,这主要是因为他们选择使用仅追加结构。因此,使用视图重复输出相同的文档会导致磁盘使用量快速增长。 (压缩你的数据库和视图通常会有帮助,但它不应该是你想要不断强迫自己做的事情)

将文档排除在外的权衡是,当您从视图中读取时,CouchDB 将需要在内部查找文档并将其包含在视图的输出中。由于它是根据 id 查找内容,因此这是一个非常快速的操作,但它仍然会产生开销。因此,虽然这种模式通常是最佳实践,但您应该愿意在您的应用程序上下文中检查权衡。