View Couchbase查询使用"\uefff“;断开下一个条件键

View Couchbase查询使用"\uefff“;断开下一个条件键,view,filter,couchbase,View,Filter,Couchbase,我在啤酒设计文档中有这样一个map()函数: function (doc, meta) { if(doc.brewery_id) emit([ doc.brewery_id, doc.abv], [doc.name, doc.abv, doc.type, doc.brewery_id, doc.style, doc.category]); } 我需要使用2条规则获取所有文档: 1.[brewery_id]以“21”开头 2.[abv]在3-4之间 我的过滤器是: startk

我在啤酒设计文档中有这样一个map()函数:

function (doc, meta) {

    if(doc.brewery_id)
    emit([ doc.brewery_id, doc.abv], [doc.name, doc.abv, doc.type, doc.brewery_id, doc.style, doc.category]);
}
我需要使用2条规则获取所有文档:

1.[brewery_id]以“21”开头

2.[abv]在3-4之间

我的过滤器是:

startkey=["21st", 3]
endkey=["21st\uefff", 4]
但结果不正确,规则1按预期工作,但规则2被忽略。 请帮我找出毛病所在

谢谢

结果如何

{"total_rows":5891,"rows":[
{"id":"21st_amendment_brewery_cafe-bitter_american","key":["21st_amendment_brewery_cafe",3.6],"value":["Bitter American",3.6,"beer","21st_amendment_brewery_cafe","Special Bitter or Best Bitter","British Ale"]},
{"id":"21st_amendment_brewery_cafe-563_stout","key":["21st_amendment_brewery_cafe",5],"value":["563 Stout",5,"beer","21st_amendment_brewery_cafe","American-Style Stout","North American Ale"]},
{"id":"21st_amendment_brewery_cafe-south_park_blonde","key":["21st_amendment_brewery_cafe",5],"value":["South Park Blonde",5,"beer","21st_amendment_brewery_cafe","Golden or Blonde Ale","North American Ale"]},
{"id":"21st_amendment_brewery_cafe-amendment_pale_ale","key":["21st_amendment_brewery_cafe",5.2],"value":["Amendment Pale Ale",5.2,"beer","21st_amendment_brewery_cafe","American-Style Pale Ale","North American Ale"]},
{"id":"21st_amendment_brewery_cafe-potrero_esb","key":["21st_amendment_brewery_cafe",5.2],"value":["Potrero ESB",5.2,"beer","21st_amendment_brewery_cafe","Special Bitter or Best Bitter","British Ale"]},
{"id":"21st_amendment_brewery_cafe-general_pippo_s_porter","key":["21st_amendment_brewery_cafe",5.5],"value":["General Pippo's Porter",5.5,"beer","21st_amendment_brewery_cafe","Porter","Irish Ale"]},
{"id":"21st_amendment_brewery_cafe-watermelon_wheat","key":["21st_amendment_brewery_cafe",5.5],"value":["Watermelon Wheat",5.5,"beer","21st_amendment_brewery_cafe","Belgian-Style Fruit Lambic","Belgian and French Ale"]},
{"id":"21st_amendment_brewery_cafe-north_star_red","key":["21st_amendment_brewery_cafe",5.8],"value":["North Star Red",5.8,"beer","21st_amendment_brewery_cafe","American-Style Amber/Red Ale","North American Ale"]},
{"id":"21st_amendment_brewery_cafe-oyster_point_oyster_stout","key":["21st_amendment_brewery_cafe",5.9],"value":["Oyster Point Oyster Stout",5.9,"beer","21st_amendment_brewery_cafe","American-Style Stout","North American Ale"]},
{"id":"21st_amendment_brewery_cafe-21a_ipa","key":["21st_amendment_brewery_cafe",7.2],"value":["21A IPA",7.2,"beer","21st_amendment_brewery_cafe","American-Style India Pale Ale","North American Ale"]}
]
}

如果需要按2个不同的范围过滤结果,可以使用LinQ,但如果有大量文档,则速度可能会很慢。因此,为了加快速度,您可以做两件事:

  • 应用LinQ“过滤器”后,缓存结果将显示在memcached或couchbase中

  • 如果您的数据模型允许您为其中一个范围创建单独的视图,即如果您可以将其中一个范围从键移动到映射功能
    If
    如: 21sts的视图:

  • 
    map:function(){if(doc.subtype==“21sts”)emit(doc.abv,null)}
    

    其中,具有子类型==“21sts”的文档是您可以通过以下方式从视图中获取的文档:

    
    map:function(){emit(doc.brewery_id,null)}
    


    和startkey=“21”,endkey=“21\uefff”。

    如果需要按两个不同的范围筛选结果,可以使用LinQ,但如果有大量文档,则速度可能较慢。因此,为了加快速度,您可以做两件事:

  • 应用LinQ“过滤器”后,缓存结果将显示在memcached或couchbase中

  • 如果您的数据模型允许您为其中一个范围创建单独的视图,即如果您可以将其中一个范围从键移动到映射功能
    If
    如: 21sts的视图:

  • 
    map:function(){if(doc.subtype==“21sts”)emit(doc.abv,null)}
    

    其中,具有子类型==“21sts”的文档是您可以通过以下方式从视图中获取的文档:

    
    map:function(){emit(doc.brewery_id,null)}
    


    和startkey=“21”,endkey=“21\uefff”。

    的可能副本。请看我的答案和菲利佩·马纳纳的解释。简短回答:couchbase在视图中只有一个索引,但您尝试使用2。我不这么认为,因为我们可以看到?startkey=[“carrot”,0]&endkey=[“carrot”,20],过滤器基于2个字段sno。你不理解我。在?startkey=[“carrot”,0]&endkey=[“carrot”,20]中,两个键中的第一个参数相等。在您的示例中,您尝试使用两个范围,即?startkey=[“carrot-1”,0]和endkey=[“carrot-20”,20]。这是两件不同的事情。我给了你同一个问题的链接。若你们仔细阅读并遵循菲利佩答案的链接,你们就会明白为什么这是两个不同的东西。谢谢!现在我明白了。但我的客户希望这样,我找到的解决方案是使用索引1(规则1)获取视图,然后使用LinQ从GetView函数的结果中过滤所有后续规则。如果我错了,请告诉我。可能的副本。请看我的答案和菲利佩·马纳纳的解释。简短回答:couchbase在视图中只有一个索引,但您尝试使用2。我不这么认为,因为我们可以看到?startkey=[“carrot”,0]&endkey=[“carrot”,20],过滤器基于2个字段sno。你不理解我。在?startkey=[“carrot”,0]&endkey=[“carrot”,20]中,两个键中的第一个参数相等。在您的示例中,您尝试使用两个范围,即?startkey=[“carrot-1”,0]和endkey=[“carrot-20”,20]。这是两件不同的事情。我给了你同一个问题的链接。若你们仔细阅读并遵循菲利佩答案的链接,你们就会明白为什么这是两个不同的东西。谢谢!现在我明白了。但我的客户希望这样,我找到的解决方案是使用索引1(规则1)获取视图,然后使用LinQ从GetView函数的结果中过滤所有后续规则。如果我错了,请告诉我。