我有这样的问题。让我们说我在CouchDB中有一个文档:
{
_id : "some_uuid",
_rev : "some_rev",
country : "Greece",
city : "Athens",
name : "John Smith",
entrance_date : "18 III 2015",
some_other_data_in_big_json : {}
}
现在。我想有一个视图,我只能读取最后一个文件(按来自entry_date排序),但是每个国家和城市。所以我想看看谁是最后一个进入希腊雅典的人。最后一个进入柏林的人......等等。
在SQL中,我会做类似连接分组和多次选择的事情......但在这里我被卡住了。如何以最有效的方式做到这一点?
答案 0 :(得分:1)
使用multipart键创建视图:
emit([doc.country,doc.city,doc.entrance_date], doc.name)
您的doc.entrance_date
值应格式化为模式YYYY-MM-DD
,以便按时间顺序自动排序。
请求 - 用例:获取一个城市的最新用户
GET /dbname/_design/ddocname/_view/viewname?startkey=[":country",":city","\u0000"]&startkey=[":country",":city","\u9999"]&descending=true&limit=1
工作原理:
要求提供一个城市的所有文档。占位符"\u0000"
(第1个Unicode字符)和"\u9999"
(最后一个Unicode字符)确保此类请求不必指定确切的时间戳。由于一个城市的所有行将按照从过去到现在的时间顺序自动排序,因此请求应通过descending=true
请求反向排序。最后limit=1
仅返回最新的行。
请求 - 用例:获取所有城市的最新用户
在每个城市必须完成一个请求之前的用例中。如果CouchDB在一个响应中响应所有城市的所有用户,则必须减少视图。
如果您需要,请在评论中请求有关此用例的更详细说明。
答案 1 :(得分:0)
这可以通过多次使用emit()函数轻松完成。例如:
emit([doc.entrance_date, doc.country], doc.name);
emit([doc.entrance_date, doc.city], doc.name);
结果视图将自动按数据排序结果,如果格式符合您的需要,例如" 2015-05-04"。 请参阅文档以获取所需的位,例如,创建视图并从中获取数据。