Couchbase大视图与小视图和多个获取

时间:2013-04-12 11:10:20

标签: mapreduce couchbase

让我们假设我们有一些包含N个文档的couchbase存储桶,每个S字节大小和V个视图计数。我们需要审阅这些文档。它们包含的所有信息。

一种方式: 创建具有此类地图功能的视图:

function (doc, meta) {
  if (meta.type == "json" && doc.type == "mytype"){
    emit([doc.field1, doc.field2], doc);
  }
}

此地图功能将在一个步骤中返回我们需要的所有数据。但另一方面,它会产生大量数据。

另一种方式: 创建一个只返回文档ID的视图(甚至使用meta.id返回文档键):

function (doc, meta) {
  if (meta.type == "json" && doc.type == "mytype"){
    emit([doc.field1, doc.field2], doc.id);
  }
}

然后在客户端获取此文件后,我们需要通过提供的ID获取每个文档,如:

couchbase.getMultiple([key1,key2,...,keyX]) *

*其中keyXdoc.id的视图。

在这种情况下,我们生成的视图数据量较少,但操作将在X + 1请求中完成。

因此,首先加载couchbase服务器并为视图消耗大量磁盘空间。第二种方式消耗较少的视图空间,但加载客户端并向couchbase服务器产生更多请求。

所以有一些问题:

  1. 哪种方式更容易接受/经常使用,或者几乎不取决于NSV值?
  2. 如果正确的方式取决于NSV这些变量的值(高/中/低)单向哪一种比其他方式更可接受?
  3. Couchbase可以轻松地水平缩放。如果客户端难以扩展,首选首选方式吗?
  4. 可能有一些测试结果可以比较这两种方式。

1 个答案:

答案 0 :(得分:2)

您使用哪种SDK来访问视图?

好的做法通常是避免发出文档ID,因为它会自动放入视图索引中。

基本规则:

  • 不要发出doc(或太多的值)
  • 不要发出密钥

看看: http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views-writing-bestpractice.html

然后,如果您的应用程序需要访问您需要执行的完整文档(例如Java):

query.setIncludeDocs(true);

在这种情况下,客户端将自动执行“get”以调用服务器并将文档加载到缓存中。 (实际上SDK正在进行多次获取。