CouchDB和多个键

CouchDB和多个键,couchdb,Couchdb,在CouchDB中可以使用类似的查询吗?喜欢使用两个键吗 SELECT field FROM table WHERE value1="key1" OR value2="key2" 我总是只用一把钥匙 function(doc) { emit(doc.title, doc); } 谢谢。是的。如果我理解你的问题,像这样的事情应该会起作用: function(doc) { a = (doc.value1 && doc.value1 == "key1"); b

在CouchDB中可以使用类似的查询吗?喜欢使用两个键吗

SELECT field FROM table WHERE value1="key1" OR value2="key2"
我总是只用一把钥匙

function(doc) {

    emit(doc.title, doc);

}

谢谢。是的。如果我理解你的问题,像这样的事情应该会起作用:

function(doc) {
  a = (doc.value1 && doc.value1 == "key1");
  b = (doc.value2 && doc.value2 == "key2");
  if (a || b) {
    emit(doc._id,doc.title);
  }
}

仅发送所需的文档或值。

在CouchDB 0.9及更高版本中,您可以使用如下主体发布到视图(或“所有文档”):

{"keys": ["key1", "key2", ...]}

为了检索具有匹配键的行集。

我将此添加到德卢斯西安的回复中:

 emit(doc.title, null)
您始终可以使用

提取“_id”和doc值。您可以通过使用两个单独的视图和少量客户端处理来执行此操作(假设您需要“动态参数”):

您将在“field1”上有一个视图,您将使用“value1”查询该视图。 (获取文档ID列表)

然后在“field2”上查询第二个视图,传递“value2”,并获得另一个文档ID列表

现在,您只需找到两个ID号列表的“交集”
(留给读者练习)

您可以创建如下视图:

function(doc){
    if(doc.value1) emit(doc.value1, doc.field);
    if(doc.value2) emit(doc.value2, doc.field);
}
然后使用llasram的建议将其发布到视图中进行查询:

{"keys": ["key1", "key2", ...]}

不过,您的客户必须警惕DUP。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"]

编辑:但是,如果同一文档包含匹配的值+键对,则会多次报告该文档。

当然,如果您事先知道“键1”和“键2”,但如果您希望它们是“动态”参数,该怎么办?这并不能回答问题。一旦您确定了需要哪些文档,就可以获取这些文档。诀窍是找出你想要的文档列表。它无法处理大量数据。交叉点是O(n logn),它将使客户无法获得足够的结果