【问题标题】:How can I query by document attribute when the attribute is an array?当属性是数组时如何按文档属性查询?
【发布时间】:2015-06-14 16:18:28
【问题描述】:

在 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);
}

但我坚持使用减少。

【问题讨论】:

    标签: mapreduce couchbase couchbase-view


    【解决方案1】:

    原来map函数就足够了,我只需要在URL中用key="cateogoryName"查询即可。

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

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

    【讨论】:

      【解决方案2】:

      如果您只想查询数据,则不需要 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)
            ...
      

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2013-09-27
        相关资源
        最近更新 更多