CouchDB是否支持多个范围查询?
如何在CouchDB中实现多个范围查询?对于单个范围条件,startkey和endkey组合可以很好地工作,但对于多范围条件则不适用 我的查看功能如下所示: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
"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]