CouchDB的是否支持多范围查询?(Does CouchDB support multiple r

2019-06-24 01:31发布

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

我的查看功能是这样的:

"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是错误的。 谁能帮我?

Answer 1:

一个CouchDB的观点是项目的有序列表。 在一个视图的查询返回表的连续切片。 因此,它不可能应用两种不平等的条件。

假设你的loan_period是离散变量,这种情况下很可能是最好先emit'ing的loan_period再发行每期一个查询解决。

另一种解决办法是使用CouchDB的,Lucene的。



Answer 2:

您使用数组作为你的钥匙。 CouchDB的将由直到2个元件是不相等的每个数组元素以递增顺序比较比较阵列。

例如,比较[1,'a',5][1,'c',0]它将比较1蒙山1,则'A'与'C',并且将决定[1, 'A',5]小于[1, 'A',0]

这就解释了为什么你的范围键查询失败:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000]大于["7446567e45dc5155353736cb3d6041c0",nil,5,90000]



Answer 3:

你发出声明看起来有点怪我。 EMIT的目的是产生一个键(即索引),然后你感兴趣的文档的值。

例如:

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

要生成用于索引的阵列,并且该视图中没有数据。

此外,CouchDB的不提供的视图,因为它不适合在地图/减少范例很好的交点。 所以,你的需求可以归结为试图解决以下问题:

我能产生独特的指数,然后我就可以从中提取特定的范围是多少? (使用startkey&endkey)



Answer 4:

实际上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}


文章来源: Does CouchDB support multiple range queries?