0

在 Couchbase Server 3.0 中,我存储桶中的文档格式如下:

{ "id":"xyz", "categories":["news", "articles", "etc.etc.."]}

我想编写一个视图,这样当我指定 key="news" 时,将返回 "categories" 数组属性中包含 "news" 的所有文档。

我什至编写了一个地图函数,它发出同一篇文章的次数与我们在“类别”数组中的元素一样多。

function (doc, meta) {
  for(var i = 0; i < doc.categories.length ; i++)
  emit(doc.categories[i], doc);
}

但我坚持减少。

4

2 回答 2

0

原来 map 功能就足够了,我只需要在 URL 中使用 key="cateogoryName" 进行查询。

我最初很困惑,因为如果您不在查询中将密钥括在引号中,您会收到一个非常神秘的错误,请参阅:https ://issues.couchbase.com/browse/MB-7555

不确定reduce函数是否会更有效..

于 2015-06-14T16:45:16.130 回答
0

如果你只是想查询数据,你不需要reduce函数,即你可以把它留空。您只需要 reduce 即可对结果集执行计算。

也可以看看:

http://docs.couchbase.com/developer/dev-guide-3.0/built-in-reduce.html

但是,您可以将地图更改为以下内容:

function (doc, meta) {
  if (doc.categories) {
    for(var i = 0; i < doc.categories.length ; i++) {
      emit(doc.categories[i], null);
    }
  }
}

并可能检查 if 语句中的类型。您可以发出 null 作为第二个参数,因为没有 reduce 函数。这可以在 Java 中查询,例如如下(异步):

bucket.async()
      .query(query)
      .flatMap(AsyncViewResult::rows)
      .flatMap(AsyncViewRow::document)
      ...
于 2015-06-14T16:45:40.980 回答