map - 为什么发出(meta.id,NULL)

标签 map couchbase emit

我已经阅读了一些示例代码(尤其是来自 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/

相关文章:

ios - CATiledLayer subview 导致内存警告和崩溃

java - 从 map 添加到堆栈

python - scrapy +couchebase : middleware or pipline?如何存储和检索数据

ruby-on-rails - AdServeModel < Couchbase::Model 的未定义方法 'validate'

c++ - 在静态函数中发出信号

javascript - 使用 $emit 刷新父数据时,AngularJS 子 Controller 数据未加载到 UI 上

node.js - 如何在 Mongoose 中间件中发出事件?

xml - 如何使用 Groovy 的 MarkupBuilder 呈现列表

hadoop - Couchbase/hadoop 连接器 : sqoop job FAILED "Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected"

arrays - 修改作为映射值的数组