在第一个示例(http://docs.couchdb.org/en/1.6.1/couchapp/views/collation.html#views-collation)下的CouchDB官方文档的View Collation章节中,建议它是不建议在视图中发出文档本身,而是建议在请求视图时包含文档的主体,方法是请求视图?include_docs=true.
如果我理解正确,而不是:
emit(doc._id, doc);
Run Code Online (Sandbox Code Playgroud)
并以下列格式获得结果:
{"id":"1","key":"1","value":{"_id": "1", "someProp": "someVal"}},
Run Code Online (Sandbox Code Playgroud)
建议发送带有空值的emits:
emit(doc._id, null)
Run Code Online (Sandbox Code Playgroud)
然后在使用include_docs参数查询我的视图时,获取以下格式的结果:
{
"id": "1",
"key": "1",
"value": null,
"doc": {
"_id": "1",
"_rev": "1-0eee81fecb5aa4f51e285c621271ff02",
"someProp": "someVal"
}
Run Code Online (Sandbox Code Playgroud)
如果有人建议,那么我认为其性能会更好,但不幸的是文档没有详细说明为什么和其他示例通常将文档作为值发布.任何人都可以对此有所了解吗?
当您emit在视图中的整个文档时,您实际上是复制磁盘上的文档.这是因为每个视图都有自己的文件,其中包含在数据库上运行视图的结果.因此,如果您有3个输出文档的视图,则会有4个副本浮动.(不计算多个文件修订版,当然会增加更多重复文件)
CouchDB非常自由地使用磁盘空间,以便使写入更快,主要是因为他们选择使用仅附加结构.因此,使用视图重复输出同一文档可能会导致磁盘使用量快速增长.(压缩您的数据库和视图通常会有所帮助,但它不应该是您想要强制自己进入的东西)
离开文档的权衡是,当您从视图中读取时,CouchDB将需要在内部查找文档并将其包含在视图的输出中.因为它是基于id查找的,所以它是一个非常快速的操作,但它仍然会产生开销.因此,虽然这种模式通常是最佳实践,但您应该愿意在应用程序的上下文中检查权衡.