【问题标题】:Couchbase Multiple KeysCouchbase 多键
【发布时间】:2012-12-19 10:51:22
【问题描述】:

我假设一个简单的问题。我有以下数据。

我想搜索 ID 为 > 2 但 30 的所有行

我使用了各种版本的:startkey=["2", null] 甚至像 startkey=["2", "30"] 这样的东西只是为了测试。

它似乎只在第一行同时运行这两个条件。所以如果我这样做:startkey=["2", "30"] 然后我会回来:

{"id":"3","key":["3","30"],"value":null},
{"id":"4","key":["4","30"],"value":null},
{"id":"5","key":["5","20"],"value":null},
{"id":"6","key":["6","60"],"value":null},
{"id":"8","key":["8","60"],"value":null}

为什么是第 5 行?

我开始意识到我需要在代码 (.net) 中处理这个问题并以某种方式进行多次调用......我似乎找不到任何有效的东西......

注意:我尝试过使用for (i = 0; i < doc.ID.length; i++) 进行循环,然后使用doc.ID[i],但它永远不会返回任何内容......

目前我只有

function (doc, meta) {
    emit([doc.ID, doc.Price ],null);
}

基本上我想在用户拥有 5 个输入键的地方进行搜索。那么我是否需要进行 5 次调用,然后继续从上一个输出中获取数据作为下一个输出的源???

我看过的其他参考资料包括:手册

提前致谢,

最诚挚的问候 罗宾

【问题讨论】:

    标签: couchbase


    【解决方案1】:

    这是一个常见的误解,使用复合数组索引键,它仍然被视为字符串,因此索引键 [2,10] 实际上是“[2,10]”,而索引键 [5,20 ],实际上是“[5,20]”。

    所以startkey=["2", "30"] 显示{"id":"5","key":["5","20"],"value":null}, 行的原因是因为它作为字符串是> startkey。

    同样,查询 startkey=[2,10]&endkey=[5,10] 返回

    {"total_rows":7,"rows":[
      {"id":"2","key":[2,20],"value":null},
      {"id":"3","key":[3,30],"value":null},
      {"id":"4","key":[4,30],"value":null}
      ]
    }
    

    因为startkey="[2,10]""[2,20]" && "[4,30]" "[5,10]"=endkey,但是"[5,20]"不在那个字符串范围内。

    使用 startkey 和 endkey 进行范围查询

    startkey => endkey 是使用 strcmp() 的 Range 查询,组和组级别基于字符串,其中逗号分隔字符串标记。

    一个很好的参考链接(因为 Couchbase 视图的工作方式很像 Apache CouchDB 视图(受它们启发)) http://wiki.apache.org/couchdb/View_collation#Collation_Specification

    空间视图/查询

    为了达到您想要的结果,您还可以编写一个空间视图来进行多维查询,仅限数字。虽然你一开始可能不会想到它

    function (doc, meta) {
      emit({
        type: "Point",
        coordinates: [doc.ID, doc.Price]
     }, meta.id);
    }
    

    查询将是一个边界框查询:

    &bbox=2,0,8,30

    {"total_rows":0,"rows":[
      {"id":"2","bbox":[2,20,2,20],"geometry":{"type":"Point","coordinates":[2,20]},"value":"2"},
      {"id":"3","bbox":[3,30,3,30],"geometry":{"type":"Point","coordinates":[3,30]},"value":"3"},
      {"id":"4","bbox":[4,30,4,30],"geometry":{"type":"Point","coordinates":[4,30]},"value":"4"},
      {"id":"5","bbox":[5,20,5,20],"geometry":{"type":"Point","coordinates":[5,20]},"value":"5"}
    ]
    }
    

    另一个查询:

    &bbox=2,30,8,30

    {"total_rows":0,"rows":[
      {"id":"3","bbox":[3,30,3,30],"geometry":{"type":"Point","coordinates":[3,30]},"value":"3"},
      {"id":"4","bbox":[4,30,4,30],"geometry":{"type":"Point","coordinates":[4,30]},"value":"4"}
     ]
    }
    

    【讨论】:

    • 嘿,伙计。感谢您的阅读。现在更有意义了。我可以让数字按预期工作,但如果它真的是一个字符串怎么办。像空间视图一样只适用于数字。如果:a)所有“键”都是字符串,或者 b)上面的第三列是字符串,但 ID 和价格是数字,该怎么办。我应该只为字符串创建一个视图,然后将输出与空间视图重新加入数字吗?
    • 忽略评论。使用弹性搜索
    • 真的有必要使用弹性搜索吗?
    • Elastic Search 允许 Map/Reduce 索引(视图)不支持的一组不同的索引、查询和集合/聚合,它是高级内容的良好补充。
    • 我已经有一段时间没有问这个问题了,但是作为一个更新的弹性,我认为沙发底座很棒。我现在几乎只使用 elastic 进行搜索并删除了 couchbase 中的所有视图。 Elastic 只是为我返回密钥,然后我从 couchbase 中检索完整的文档。整个过程非常快而且非常灵活。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多