【问题标题】:Couchbase view using “WHERE” clause dynamically动态使用“WHERE”子句的 Couchbase 视图
【发布时间】:2016-03-04 15:07:19
【问题描述】:

我有以下格式的 Json 文档

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

我有这样的地图功能

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

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

【问题讨论】:

    标签: mapreduce couchbase couchbase-view


    【解决方案1】:

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

    1. 它没有任何过滤
    2. 函数头应该是函数(doc, meta)
    3. 如果您在 json 和二进制对象之间混合使用 - 添加 meta.type == "json"

    现在是你可以做的事情:

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

    即如果我有

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

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

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

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

    无论如何,如果您有一些过滤条件 - 总是推荐的。

    【讨论】:

    • 我的错误 我在帖子中写了不正确的标题函数。无论如何,多次发射不会解决我的问题,因为假设我有两个像这样的发射 emit(doc.age,null) emit(doc.level,null);现在我将 1 个值传递给 key 以过滤所有年龄为 1 的文档。但它也会给我那些具有 1 级的文档。所以当两个字段具有相同的值时,多次发出不会有帮助
    • 你可以在它前面附加字符串,比如:function (doc, meta) { if (meta.type=="json") { emit("name_" + doc.name, null); emit("age_" + doc.age, null); } }
    • 我的 json 文档格式是什么?像这样 ` "name" : "name_legendary" `
    • 它不会影响您的 JSON(数据)。您的文件将保持不变。唯一会改变的是您的视图,它们会查询您可以作为键访问的字符串。您将能够正常参考原始文档。
    • 好吧,这个方法奏效了。但是有没有其他更动态的方法,比如我有 20 列,为了使这种方法起作用,我必须对每个组合进行发射,因此会有很多组合。有没有更通用的方法,比如在 n1ql 我们有 where 子句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多