Couchbase视图动态使用“WHERE”子句

时间:2016-03-04 15:07:20

标签: mapreduce couchbase couchbase-view

我有以下格式的Json文档

Name :
Class :
City :
Type :
Age :
Level :
Mother :
Father :

我有这样的地图功能

function(doc,meta)
{
    emit([doc.Name,doc.Age,doc.Type,doc.Level],null);
}

我能做的就是给出“名字”并过滤掉所有结果,但我还想做的只是给出“年龄”并过滤掉。因为该couchbase不提供跳过“名称”键的功能。所以我必须创建一个新的地图函数,其中“Age”作为第一个键,但我也必须只查询“Level”键,所以这样。我必须为每个字段创建许多地图函数,这显然是不可行的,除了制作新的地图功能以实现这种类型的功能之外还有什么我可以做的吗? 我不能用n1ql因为我有1.5亿个文件所以需要花费很多时间。

1 个答案:

答案 0 :(得分:2)

首先 - 这不是一个非常好的减少功能。

  1. 它没有任何过滤
  2. 函数头应该是函数(doc,meta)
  3. 如果你有json和二进制对象之间的混合 - 添加meta.type ==“json”
  4. 现在你可以做的事情:

    1. 如果您使用的是v4及更高版本(更推荐使用v4.1),您可以使用N1QL并使用它与SQL语言非常相似。 (我不明白为什么你不能使用n1ql)
    2. 您可以按多个顺序发出多个项目
    3. 即。如果我有

      格式的文档
      {
        "name": "Roi",
        "age": 31
      }
      

      我可以向索引发出两个值:

      function (doc, meta) {
        if (meta.type=="json") {
          emit(doc.name, null);  
          emit(doc.age, null);
        }
      }
      

      现在我可以通过2个值进行查询。 这比创建2个视图要好得多。

      无论如何,如果你有东西可以过滤 - 总是建议。