Couchbase多钥匙

Couchbase多钥匙,couchbase,Couchbase,我想问一个简单的问题。我有以下数据 我想搜索ID大于2但小于8且价格大于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":

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

我想搜索ID大于2但小于8且价格大于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}
为什么第五排在那里

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

注意:我曾经尝试过使用
for(I=0;I
做一个循环,然后使用
doc.ID[I]
,但它从不返回任何内容

目前我只有

function (doc, meta) {
    emit([doc.ID, doc.Price ],null);
}
基本上,我希望有一个搜索,其中有5个输入键,用户有。那么,我是否需要进行5次调用,然后继续从上一次输出中获取数据作为下一次输出的源

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

提前感谢,

亲切的问候
Robin

这是一个常见的误解,对于复合数组索引键,它仍然被视为字符串,因此索引键[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()的范围查询,组和组级别基于字符串,其中逗号分隔字符串标记

一个很好的参考链接(因为Couchbase视图的工作原理与ApacheCouchDB视图非常相似(受其启发))

空间视图/查询 为了获得您想要的结果,您还可以编写一个空间视图来进行多维查询,仅限于数字查询。虽然你一开始可能不这么想

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和price是数字。我是否应该只为字符串创建一个视图,然后将输出与数字的空间视图连接起来?忽略注释。使用弹性搜索使用弹性搜索真的有必要吗?弹性搜索允许一组不同的索引、查询和集合/聚合,而映射/减少索引(视图)不允许,这是对高级内容的一个很好的补充。我问这个问题已经有一段时间了,但作为弹性搜索的一个更新,我认为couchbase非常好。我现在几乎完全使用elastic进行搜索,并删除了couchbase中的所有视图。Elastic只是为我返回密钥,然后我从couchbase检索完整文档。整个过程速度快得可笑,而且非常灵活。