如何在多个范围查询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是错误的。 谁能帮我?
一个CouchDB的观点是项目的有序列表。 在一个视图的查询返回表的连续切片。 因此,它不可能应用两种不平等的条件。
假设你的loan_period是离散变量,这种情况下很可能是最好先emit'ing的loan_period再发行每期一个查询解决。
另一种解决办法是使用CouchDB的,Lucene的。
您使用数组作为你的钥匙。 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]
你发出声明看起来有点怪我。 EMIT的目的是产生一个键(即索引),然后你感兴趣的文档的值。
例如:
emit( doc.index, [doc.name, doc.address, ....] );
要生成用于索引的阵列,并且该视图中没有数据。
此外,CouchDB的不提供的视图,因为它不适合在地图/减少范例很好的交点。 所以,你的需求可以归结为试图解决以下问题:
我能产生独特的指数,然后我就可以从中提取特定的范围是多少? (使用startkey&endkey)
实际上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}