我有一个数据库,我需要获取一些值。数据库由包含房间的文件组成,每个房间都有“楼层”和“酒店”(还有一些,但在这里并不重要)。
事情是;我需要到达我要求的酒店的所有楼层。 getAllFloorsOnHotel("hotel")
有点事。但我不知道如何查询数据库。我在这里读到:http://guide.couchdb.org/editions/1/en/cookbook.html#unique,但这不是我需要的。在那里,他们使用密钥和group=true
来删除重复项,如果地板是关键,这将有效,但在我的情况下,酒店是关键。因此,如果我使用group=true
,我自然只能回到那家酒店一楼。如果我不使用group=true
,我会返回指定酒店的所有楼层 - 重复。
如何让couchdb给我回酒店的所有楼层,没有重复?
答案 0 :(得分:2)
您需要使用数组作为密钥。
在地图功能中,您的发射应如下所示:
emit([doc.hotel, doc.floor], null);
我为该值设置了null,但它可以是您想要用于reduce函数的任何内容。要获得每个酒店的每个楼层的列表,您的reduce函数才能返回true。
然后在查询时,使用group_level而不是group,并将其分配到您希望分组的数组级别。 group_level = 2将逐层分组。
使用curl查询您要去的房间:
curl -X GET http://localhost:5894/yourDB/yourView?group_level=2
这将为您提供所有酒店及其所有楼层。要获取特定酒店的列表,您需要查询范围。很难用curl来展示如何做到这一点,因为你必须对数组字符串做各种各样的事情才能使它工作。您需要的变量是startkey和endkey。无论如何你可能正在使用ajax,所以只需将它们作为选项传递。
startkey: ["hotelName", 0],
endkey: ["hotelName", {}],
group_level: 2
0和{}只是低值和高值。 {}最后排序,所以无论你的字符串是什么,都将介于这两件事之间。
另外,如果你使用descending:true,你需要切换0和{}。 (这给我带来了很大的痛苦)