【发布时间】:2017-11-22 03:49:30
【问题描述】:
是否可以在 CouchDB 中使用类似的查询?喜欢使用两个键?
SELECT field FROM table WHERE value1="key1" OR value2="key2"
我一直只用一把钥匙。
function(doc) {
emit(doc.title, doc);
}
谢谢。
【问题讨论】:
标签: couchdb
是否可以在 CouchDB 中使用类似的查询?喜欢使用两个键?
SELECT field FROM table WHERE value1="key1" OR value2="key2"
我一直只用一把钥匙。
function(doc) {
emit(doc.title, doc);
}
谢谢。
【问题讨论】:
标签: couchdb
在 CouchDB 0.9 及更高版本中,您可以 POST 到具有如下正文的视图(或 _all_docs):
{"keys": ["key1", "key2", ...]}
为了检索具有匹配键的行集。
【讨论】:
是的。如果我理解你的问题,这样的事情应该可以解决问题:
function(doc) {
a = (doc.value1 && doc.value1 == "key1");
b = (doc.value2 && doc.value2 == "key2");
if (a || b) {
emit(doc._id,doc.title);
}
}
只发出您需要的文档或值。
【讨论】:
【讨论】:
你可以像这样创建一个视图:
function(doc){
if(doc.value1) emit(doc.value1, doc.field);
if(doc.value2) emit(doc.value2, doc.field);
}
然后使用 llasram 的建议查询它以 POST 到视图:
{"keys": ["key1", "key2", ...]}
不过,您的客户必须对重复操作保持警惕。 doc.value1 == "key1" && doc.value2 == "key2" 的文档将显示两次。只需使用 _id 过滤结果。
【讨论】:
需要稍微扩展一下 llasram 的答案;索引必须包含两个字段的值:
function(doc) {
emit("value1:"+doc.value1); // add check for undefined, null, etc.
emit("value2:"+doc.value2);
}
然后查询
keys=["value1:key1","value2:key2"]
编辑:但是,如果它包含匹配的值+键对,这将多次报告同一个文档。
【讨论】:
您可以通过使用 2 个单独的视图和一些客户端处理来做到这一点(假设您需要“动态参数”):
您将在“field1”上有一个视图,您可以使用“value1”进行查询。 (获取文档 ID 列表)
然后您查询“field2”的第二个视图,传递“value2”,并获取另一个文档 ID 列表。
现在,您只需找到 2 个 ID 号码列表的“交集” (留给读者练习)
【讨论】: