Mapreduce 使用“;其中”;动态子句

Mapreduce 使用“;其中”;动态子句,mapreduce,couchbase,couchbase-view,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不提供跳过“Name”键的功能。所以我必须创建一个新的map函数,

我有以下格式的Json文档

Name :
Class :
City :
Type :
Age :
Level :
Mother :
Father :
我有一个像这样的映射函数

function(doc,meta)
{
    emit([doc.Name,doc.Age,doc.Type,doc.Level],null);
}
我能做的是给出“姓名”并过滤掉所有结果,但我也想做的是只给出“年龄”并过滤掉。因为couchbase不提供跳过“Name”键的功能。所以我必须创建一个新的map函数,它的第一个键是“Age”,但我也必须只查询“Level”键,也是这样。我必须为每个字段创建许多映射函数,这显然是不可行的,所以除了创建新的映射函数来实现这类功能之外,我还能做些什么?
我不能使用n1ql,因为我有1.5亿个文档,所以需要花费很多时间。

首先,这不是一个很好的reduce函数

  • 它没有任何过滤功能
  • 函数标题应为函数(文档、元)
  • 如果json和二进制对象混合使用-添加meta.type==“json”
  • 现在,关于您可以做的事情:

  • 如果您使用的是v4及以上版本(更推荐使用v4.1),那么您可以使用N1QL,并使用与SQL语言非常类似的语言。(我不明白为什么不能使用n1ql)
  • 可以按多个顺序发出多个项
  • i、 e.如果我有以下格式的文件:

    {
      "name": "Roi",
      "age": 31
    }
    
    我可以向索引发出两个值:

    function (doc, meta) {
      if (meta.type=="json") {
        emit(doc.name, null);  
        emit(doc.age, null);
      }
    }
    
    现在我可以按2个值进行查询。 这比创建两个视图要好得多


    不管怎么说,如果你有什么东西可以过滤的话——这总是被推荐的。

    首先,这不是一个很好的reduce函数

  • 它没有任何过滤功能
  • 函数标题应为函数(文档、元)
  • 如果json和二进制对象混合使用-添加meta.type==“json”
  • 现在,关于您可以做的事情:

  • 如果您使用的是v4及以上版本(更推荐使用v4.1),那么您可以使用N1QL,并使用与SQL语言非常类似的语言。(我不明白为什么不能使用n1ql)
  • 可以按多个顺序发出多个项
  • i、 e.如果我有以下格式的文件:

    {
      "name": "Roi",
      "age": 31
    }
    
    我可以向索引发出两个值:

    function (doc, meta) {
      if (meta.type=="json") {
        emit(doc.name, null);  
        emit(doc.age, null);
      }
    }
    
    现在我可以按2个值进行查询。 这比创建两个视图要好得多


    不管怎样,如果你有什么东西可以过滤的话,我们总是建议你这样做。

    我的错误,我在帖子中写了不正确的标题函数。无论如何,多个emit不能解决我的问题,因为假设我有两个像这样的emit(doc.age,null)emit(doc.level,null);现在我将1值传递给key,以过滤所有年龄为1的文档。但它也会给我那些1级的文件。因此,当两个字段具有相同的值时,多个emit不会有帮助。您可以在它前面附加字符串,例如:
    function(doc,meta){if(meta.type==“json”){emit(“name”+doc.name,null);emit(“age”+doc.age,null);}
    我的json文档格式是什么?像这样的“name”:“name\u legendary”`它不会影响您的JSON(数据)。您的文档将保持不变。唯一会改变的是您的视图,它们查询您可以作为键访问的字符串。您将能够正常地引用原始文档。Okat thanx此方法有效。但是还有其他更动态的方法吗,比如我有20个列,为了让这个方法工作,我必须对每个组合进行发射,所以会有很多组合。有没有像n1ql中的where子句那样更通用的方法?我的错误,我在帖子中写了不正确的头函数。无论如何,多个emit不能解决我的问题,因为假设我有两个像这样的emit(doc.age,null)emit(doc.level,null);现在我将1值传递给key,以过滤所有年龄为1的文档。但它也会给我那些1级的文件。因此,当两个字段具有相同的值时,多个emit不会有帮助。您可以在它前面附加字符串,例如:
    function(doc,meta){if(meta.type==“json”){emit(“name”+doc.name,null);emit(“age”+doc.age,null);}
    我的json文档格式是什么?像这样的“name”:“name\u legendary”`它不会影响您的JSON(数据)。您的文档将保持不变。唯一会改变的是您的视图,它们查询您可以作为键访问的字符串。您将能够正常地引用原始文档。Okat thanx此方法有效。但是还有其他更动态的方法吗,比如我有20个列,为了让这个方法工作,我必须对每个组合进行发射,所以会有很多组合。有没有像n1ql中的where子句那样更通用的方法?