从Couchbase的视图查询结果返回完整文档

时间:2015-03-02 15:13:21

标签: c# couchbase

我正在尝试构建过滤视图,我可以根据列范围过滤文档。我的地图功能看起来像这样:

function (doc, meta) {
  if(!doc.tombstone) {
    emit([doc.effectiveDateTime]);
  }
}

当我从代码中查询此视图时,结果只有键而不是文档。

我可以想出以下解决这个问题的方法,并需要帮助决定哪个方法可以解决。

  1. setIncludeDocs :稍微探索一下文档,我来到这个java code snippet,其中在查询上调用setIncludeDocs方法返回完整文档结果。 看起来很有希望,遗憾的是我在C#SDK中找不到这种方法的等价物。

  2. 查询单个文档:将文档ID作为emit([doc.effectiveDateTime], meta.id);之类的值发出,并从客户端单独查询每个文档。我不想使用这种方法,因为客户端最终会多次调用服务器来获取完整的结果集,并且会导致客户端出现性能问题。

  3. 发送整个文档:我可以将整个文档作为mapper的emit语句中的值发出,如下所示:emit([doc.effectiveDateTime], doc);。这种方法的优点是客户端只需要调用一次即可获得结果集。但我不确定这对指数规模的影响。鉴于我的映射器可以处理大多数文档,索引大小会增长还是沙发基会能够以某种方式在内部对其进行优化?

  4. 查询reduce函数内的文档(不确定这是否可行):如果我修改mapper以将文档ID作为值发出并具有查询和获取整个文档的机制从reducer里面,我应该能够在reducer里面形成结果集。 是否有任何javascript apis可用于从reducer内部访问数据库?

  5. 对于上述观点或任何新观点的任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

在C#SDK 2.x中,最好的选择是选项2.有一个转折:查询引擎已经将文档的ID作为其响应元数据的一部分发出,您的视图无需发出它。

使用Rows的{​​{1}}方法迭代行。这会为您提供每行IViewResult。在ViewRow<T>上,只需获取ViewRow属性即可。然后,您可以按常规方式Id关联文档。