3

我有一个关于 couchdb views / map-reduce 的问题。

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

[{
        _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"]
    }]

要查找所有 3 星级酒店,以下视图将适合:

function(doc) {
    emit([doc.stars, doc.name]);
}

如果我使用 startkey=[3],一切都很好。

但是如何使用多个过滤器制作视图呢?

例如 - 所有酒店:

  • 带有 3 星和“家庭友好型”和“宠物友好型”标志以及 hotelType“预算”?
  • 与hotelType“高级”和食物“早餐”或“午餐”?
  • 等等

有任何想法吗?

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

4

3 回答 3

2

您可以发出带有一组值的键:

emit([[doc.stars,doc.hotelType], doc.name]);

问题在于,这只有在您可以按重要性排序属性时才有效,因为它们总是会以相同的顺序减少。Kxepal 使用不同视图的解决方案可能最适合您的情况。

资料来源:http ://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping

于 2012-10-17T15:20:34.500 回答
1

您需要为此使用不同的视图。每个视图都将使用自己的密钥处理自己的域。您可以通过多个具有不同值的发射来创建单一视图的所有数据key,但从角度来看,这将很难维护。

于 2012-10-17T15:12:37.690 回答
0

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

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

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

于 2012-10-18T06:09:18.570 回答