当属性是数组时,如何通过document属性进行查询?

时间:2015-06-14 16:18:29

标签: mapreduce couchbase couchbase-view

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

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

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

我写了一个地图函数,就像我们在“categories”数组中有元素一样多次发出相同的文章。

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

但我坚持减少。

2 个答案:

答案 0 :(得分:0)

原来地图功能就足够了,我只需要在URL中用key =“cateogoryName”查询。

我最初感到困惑,因为如果你没有在查询中用引号括起来,你会得到一个非常神秘的错误,请参阅:https://issues.couchbase.com/browse/MB-7555

不确定减少功能是否会更有效..

答案 1 :(得分:0)

如果您只想查询数据,则不需要缩减功能,即您可以将其保留为空。您只需要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)
      ...