在CouchDB官方文档的"查看排序规则"一章中,第一个示例(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-排序规则),建议不建议在视图中发出文档本身,而是建议在请求视图时通过?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非常自由地使用磁盘空间,以便更快地进行写入,这主要是由于他们选择使用仅追加结构。因此,使用视图重复输出同一文档可能会导致磁盘使用量快速增长。(压缩数据库和视图通常会有所帮助,但这不应该是你想不断强迫自己的事情)
忽略文档的代价是,当您从视图中读取时,CouchDB需要在内部找到文档并将其包含在视图的输出中。由于它是根据id查找内容的,所以这是一个非常快速的操作,但仍会产生开销。因此,虽然这种模式通常是最佳实践,但您应该在应用程序的上下文中检查权衡。