【问题标题】:Does CouchDB support multiple range queries?CouchDB 是否支持多范围查询?
【发布时间】:2009-06-24 07:15:18
【问题描述】:

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

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

【问题讨论】:

    标签: couchdb range conditional-statements


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        例如:

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

        您正在为索引生成一个数组,而没有为视图生成数据。

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

        我可以生成一个唯一索引,然后从中提取特定范围吗? (使用开始键和结束键)

        【讨论】:

          【解决方案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}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-15
            • 2014-02-07
            • 1970-01-01
            相关资源
            最近更新 更多