5

我已经阅读了一些示例代码(尤其是来自 Couchbase Model Views 演示项目链接)并意识到 map() 函数是如此奇怪。

function(doc, meta) {
   if (doc.type == "beer" && doc.name){
       emit(doc.name, null);
   }
}

为什么发出函数的值为空,但 GetView("beers", "beer") 的结果却完美地获得了值???

请帮帮我!

4

1 回答 1

7

在 couchbase 中,通常视图的结果集是在后台构建的。例如,如果您有 100 万个每个 4Kb 大小的文档而没有任何视图,则磁盘上大约需要 4Gb。当您使用地图功能创建视图时

function(doc, meta) {
   emit(doc.name, doc);
}

因此,查看结果需要额外的 4Gb 磁盘空间,因为查看结果是单独存储的。在大多数情况下(如果您使用 param 查询视图Stale=Ok)couchbase 返回来自“预编译”记录集的结果,couchbase 不会扫描每个查询的所有文档。

因此,在 map 函数中使用 null 可以防止磁盘空间的使用,也可以提高索引过程的速度。

现在关于沙发底座魔术的第二个问题是“GetView("beers", "beer") 的结果完美地获得了价值”。Couchbaseget(key)getMulti(keys)操作非常快。因此,当您查询发出null它的视图时,它不仅返回nulls,它还返回文档 ID。然后,您可以手动使用getMulti该文档 ID 数组来获取文档的值,或者在某些 SDK 中调用查询参数IncludeDocs,它会自动执行相同的操作。

于 2013-08-23T05:41:34.633 回答