2010-08-23 57 views
7

是否可以在CouchDB中使用类似的查询?喜欢用两个键CouchDB和多个键

SELECT field FROM table WHERE value1="key1" OR value2="key2" 

我总是只用一个键。

function(doc) { 

    emit(doc.title, doc); 

} 

谢谢。

回答

0

是的。如果我理解你的问题,像这样的应该做的伎俩:

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

只发出你需要的文件或值。

+7

嗯,当然,如果你事先知道“key1”和“key2”,但是如果你想让他们成为“动态”参数呢? – 2011-11-16 18:01:39

4

在CouchDB中0.9和上面可以张贴到视图(或_all_docs)与身体像:

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

为了检索该组与匹配键的行的。

+0

这不回答这个问题。一旦你找到了你想要的文件,这只是得到文件。诀窍是搞清楚你想要的文件清单。 – 2011-11-16 18:09:27

0

我想补充这duluthian的答复:

emit(doc.title, null) 

您可以随时拉出“_id”,并使用view api.

-2

你能做到这一点DOC值(假设你要“动态参数“)通过使用2个单独的视图和一个小小的客户端处理:

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

然后,您查询“field2”上的第二个视图,传递“value2”,并获取Doc ID的另一个列表。现在

,你只需要找到该ID号 的2所列出的“交叉点”(作为练习留给读者)

+3

它只是不适用于大量的数据。交集是O(n log n),它会使客户窒息足够的结果 – Andrea 2012-05-31 08:15:03

0

您可以创建这样一个观点:

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来过滤结果。

0

一个需要扩大一点llasram的答案;该指数必须包含值这两个领域:

function(doc) { 
    emit("value1:"+doc.value1); // add check for undefined, null, etc. 
    emit("value2:"+doc.value2); 
} 

然后用

keys=["value1:key1","value2:key2"] 

编辑查询:这将同一文件多次举报但如果它包含的匹配值+密钥对。