我已经阅读了一些示例代码(特别是来自Couchbase模型视图演示项目link)并且意识到map()函数非常奇怪。
function(doc, meta) {
if (doc.type == "beer" && doc.name){
emit(doc.name, null);
}
}
为什么emit函数的值为null,但GetView(“啤酒”,“啤酒”)的结果是完美的值?
请帮帮我!
答案 0 :(得分:7)
在couchbase中,通常视图的结果集是在后台构建的。如果您有例如每个4Kb大小的100万个文档而没有任何视图,那么它需要~4Gb的磁盘。使用地图功能(如
)创建视图时function(doc, meta) {
emit(doc.name, doc);
}
因此,视频结果会在磁盘上额外增加4Gb,因为视图结果是单独存储的。在大多数情况下(如果使用param Stale=Ok
查询视图),couchbase将返回“预编译”记录集的结果,couchbase不会扫描每个查询的所有文档。
因此,在map函数中使用null来防止磁盘空间使用,并且还可以提高索引编制过程的速度。
现在关于沙发基地魔术的第二个问题,“来自GetView(”啤酒“,”啤酒“)的结果正在获得完美的价值”。 Couchbase get(key)
和getMulti(keys)
操作非常快。因此,当您查询发出null
的视图时,它不仅会返回nulls
,还会返回文档ID。然后,您可以为该文档ID数组手动使用getMulti
来获取文档的值,或者在某些SDK中,有一个名为IncludeDocs
的查询参数将自动执行相同的操作。