0

我有一个数据库,我需要在其中获取一些值。该数据库由包含房间的文档组成,每个房间都有属性“地板”和“酒店”(还有更多,但它们在这里并不重要)。

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

我怎样才能让 couchdb 把酒店的所有楼层都还给我,没有重复?

4

1 回答 1

2

您需要使用数组作为键。

在你的 map 函数中,你的 emit 应该是这样的:

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 在同一视图中排序和过滤

于 2013-02-21T11:19:47.393 回答