我已经阅读了一些示例代码(尤其是来自 Couchbase 模型 View 演示项目 link )并意识到 map() 函数是如此奇怪。
function(doc, meta) {
if (doc.type == "beer" && doc.name){
emit(doc.name, null);
}
}
为什么emit 函数的值为null,但GetView("beers", "beer") 的结果却完美地获取了值???
请帮帮我!
最佳答案
在 couchbase 中, View 的结果集通常是在后台构建的。例如,如果您有 100 万个文档,每个 4Kb 大小没有任何 View ,则磁盘上需要大约 4Gb。当您使用 map 功能创建 View 时
function(doc, meta) {
emit(doc.name, doc);
}
因此,查看结果需要额外的 4Gb 磁盘空间,因为查看结果是单独存储的。在大多数情况下(如果您使用参数
Stale=Ok
查询 View ),couchbase 会从“预编译”记录集返回结果,couchbase 不会扫描每个查询的所有文档。因此,在映射函数中发出 null 用于防止磁盘空间使用并提高索引过程的速度。
现在关于沙发基地魔术的第二个问题,当“来自 GetView("beers", "beer") 的结果完美地获得值(value)时”。沙发底座
get(key)
和 getMulti(keys)
操作非常快。因此,当您查询发出 null
的 View 时它不仅返回 nulls
,它还返回文档 ID。然后你可以手动使用getMulti
对于该文档 id 数组以获取 doc 的值,或者在某些 SDK 中有名为 IncludeDocs
的查询参数这将自动执行相同的操作。
关于map - 为什么发出(meta.id,NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18394642/