当属性为数组时,如何按文档属性查询



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

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

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

我甚至编写了一个 map 函数,该函数发出同一篇文章的次数与"类别"数组中的元素一样多。

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

但我坚持减少。

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

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

不确定reduce功能是否会更有效。

如果你只想查询数据,你不需要一个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 作为第二个参数,因为没有减少函数。这可以在Java中查询,例如如下(异步):

bucket.async()
      .query(query)
      .flatMap(AsyncViewResult::rows)
      .flatMap(AsyncViewRow::document)
      ...

相关内容

  • 没有找到相关文章

最新更新