CouchDB:获得独特的价值观

时间:2013-02-21 09:52:48

标签: javascript couchdb

我有一个数据库,我需要获取一些值。数据库由包含房间的文件组成,每个房间都有“楼层”和“酒店”(还有一些,但在这里并不重要)。

事情是;我需要到达我要求的酒店的所有楼层。 getAllFloorsOnHotel("hotel")有点事。但我不知道如何查询数据库。我在这里读到:http://guide.couchdb.org/editions/1/en/cookbook.html#unique,但这不是我需要的。在那里,他们使用密钥和group=true来删除重复项,如果地板是关键,这将有效,但在我的情况下,酒店是关键。因此,如果我使用group=true,我自然只能回到那家酒店一楼。如果我不使用group=true,我会返回指定酒店的所有楼层 - 重复。

如何让couchdb给我回酒店的所有楼层,没有重复?

1 个答案:

答案 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和{}。 (这给我带来了很大的痛苦)

这里有更多信息: CouchDB sorting and filtering in the same view