在couchDB中获取每个组中的第一个元素

时间:2015-05-05 18:16:54

标签: mapreduce couchdb

我有这样的问题。让我们说我在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中,我会做类似连接分组和多次选择的事情......但在这里我被卡住了。如何以最有效的方式做到这一点?

2 个答案:

答案 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"。 请参阅文档以获取所需的位,例如,创建视图并从中获取数据。