CouchDB是否支持多范围查询?

时间:2009-06-24 07:15:19

标签: couchdb range conditional-statements

如何在CouchDB中实现多个范围查询?对于单一范围条件,startkey和endkey组合工作正常,但同样的事情不适用于多范围条件。

My View功能如下:

"function(doc){
       if ((doc['couchrest-type'] == 'Item') 
    && doc['loan_name']&& doc['loan_period']&&    
                      doc['loan_amount']) 
     {  emit([doc['template_id'],
          doc['loan_name'],doc['loan_period'],
           doc['loan_amount']],null);}}"

我需要使用loan_period>获取整个文档5和 loan_amount> 30000.我的startkey和endkey参数如下:

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true}  

在这里,我没有得到理想的结果。我认为我的startkey和endkey params是错误的。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:4)

CouchDB视图是一个有序的条目列表。视图上的查询返回该列表的连续切片。因此,不可能应用两个不等式条件。

假设你的loan_period是一个离散变量,这种情况可能最好通过首先发出loan_period然后为每个时期发出一个查询来解决。

另一种解决方案是使用couchdb-lucene。

答案 1 :(得分:1)

您正在使用数组作为密钥。 Couchdb将通过按递增顺序比较每个数组元素来比较数组,直到两个元素不相等。

E.g。比较[1,'a',5][1,'c',0]它会比较1个1,然后'a'和'c'并且将决定[1,'a',5]小于[1,'a' ,0]

这解释了您的范围键查询失败的原因:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000]更高["7446567e45dc5155353736cb3d6041c0",nil,5,90000]

答案 2 :(得分:0)

你的emit语句对我来说有点奇怪。 emit的目的是生成一个键(即索引),然后生成您感兴趣的文档值。

例如:

emit( doc.index, [doc.name, doc.address, ....] );

您正在为索引生成数组,并且没有视图的数据。

此外,Couchdb没有提供视图的交集,因为它不太适合map / reduce范例。因此,您需要归结为尝试解决以下问题:

我可以生成一个唯一的索引,然后我可以从中提取特定范围吗? (使用startkey& endkey)

答案 3 :(得分:0)

实际上,CouchDB允许视图具有复杂的键,这些键是问题中给出的值数组:

[template_id, loan_name, loan_period, loan_amount]

你试过吗

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true}

或者

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true}