CouchDB是否支持多个范围查询?

CouchDB是否支持多个范围查询?,couchdb,range,conditional-statements,Couchdb,Range,Conditional Statements,如何在CouchDB中实现多个范围查询?对于单个范围条件,startkey和endkey组合可以很好地工作,但对于多范围条件则不适用 我的查看功能如下所示: "function(doc){ if ((doc['couchrest-type'] == 'Item') && doc['loan_name']&& doc['loan_period']&& doc['loan_am

如何在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);}}"
params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true}  
我需要获得贷款期为5年的全部单据
贷款金额
>30000。我的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);}}"
params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000],
  :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true}  

在这里,我没有得到想要的结果。我认为我的开始键和结束键参数是错误的。有人能帮我吗?

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

例如:

emit( doc.index, [doc.name, doc.address, ....] );
您正在为索引生成数组,但没有为视图生成数据

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


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

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

假设您的loan_period是一个离散变量,最好先发出loan_period,然后为每个期间发出一个查询


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

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

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

例如,要比较
[1,'a',5]
[1,'c',0]
它会将1与1进行比较,然后将'a'与'c'进行比较,并确定[1,'a',5]小于[1,'a',0]

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

[“7446567E45DC51553736CB3D6041C0”,无530000]
大于
[“7446567E45DC51553736CB3D6041C0”,无590000]