Map CouchDB视图-多过滤器

Map CouchDB视图-多过滤器,map,mapreduce,couchdb,Map,Mapreduce,Couchdb,我有一个关于couchdb视图/地图缩减的问题 比如说,我们有一个包含以下酒店文档的数据库: [{ _id: "1", name: "Hotel A", type: "hotel", stars: 3, flags: ["family-friendly","green-hotel","sport"], hotelType: "premium", food: ["breakfast","

我有一个关于couchdb视图/地图缩减的问题

比如说,我们有一个包含以下酒店文档的数据库:

[{
        _id: "1",
        name: "Hotel A",
        type: "hotel",
        stars: 3,
        flags: ["family-friendly","green-hotel","sport"],
        hotelType: "premium",
        food: ["breakfast","lunch"]
    }, {
        _id: "2",
        name: "Hotel B",
        type: "hotel",
        stars: 5,
        flags: ["family-friendly","pet-friendly"],
        hotelType: "budget",
        food: ["breakfast","lunch","dinner"]
    }]
要查找所有三星级酒店,请查看以下视图:

function(doc) {
    emit([doc.stars, doc.name]);
}
如果我使用startkey=[3],一切都很好

但是,如何使用多个过滤器创建视图呢

例如,所有酒店:

  • 三颗星和国旗“家庭友好型”和“宠物友好型”以及 使用hotelType“预算”
  • 酒店类型“高级”和食物“早餐”或“午餐”
  • 等等
有什么想法吗

编辑:
我现在决定使用好的老mysql。CouchDB对我来说是一次很好的体验,但是如果您需要的不仅仅是一个文档的数据,那么会有太多的问题:(

您需要为此使用不同的视图。每个视图将使用自己的键处理自己的域。您可以使用不同的
值通过多个emit为所有数据创建一个视图,但在透视图中很难维护。

您可以使用一组值来发射一个键:

emit([[doc.stars,doc.hotelType], doc.name]);
问题是,只有当您可以按重要性对属性排序时,这才有效,因为它们总是以相同的顺序减少。Kxepal使用不同视图的解决方案可能最适合您的情况


来源:

CouchDB视图是一维的。您正在寻找多维查询:

  • x=星星
  • y=标志
  • z=酒店类型

遗憾的是,多维查询不受支持。例如,如果您需要按纬度和经度查询地理位置,则必须使用GeoCoach。

感谢您的反馈。我知道我可以多次发射,并且可以使用数组作为键。函数(doc){//按名称发射([1,doc.name]);//按hotelType emit([2,doc.hotelType]);//按(doc.flags中的变量i){emit([3,doc.flags[i]]);}//按星和一个(doc.flags中的变量i){emit([4,doc.doc.flags[i]]);}的标志,但如何搜索例如“按星和多个标志”有什么解决方案吗?谢谢你的反馈。但是有没有解决我的问题的方法?不要使用CouCHDB?使用列表函数等等。你需要考虑这个任务的SQL数据库。或者你需要SQL,这样你就可以独立地比较两个值,或者你需要为你的搜索查询的每一个组合创建一个视图。CouchDB是这样设计的,因此它可以扩展。