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

Mapreduce 在couchDB中获取每个组中的第一个元素,mapreduce,couchdb,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 : {} } 现在。我想有一个视图,在那里我只能阅读最后一个文档(按入口日期排序),但每个国家和城市

我有这样的问题。假设我在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 : {}
}
现在。我想有一个视图,在那里我只能阅读最后一个文档(按入口日期排序),但每个国家和城市都可以。所以我想看看谁是最后一个进入希腊雅典的人。最后一个进入德国柏林的人。。。等等


在SQL中,我会做一些类似于连接、分组和多重选择的事情。。。但我被困在这里了。如何以最有效的方式执行此操作?

这可以通过多次使用emit()函数轻松完成。例如:

emit([doc.entrance_date, doc.country], doc.name);
emit([doc.entrance_date, doc.city], doc.name);
结果视图将自动按数据对结果进行排序,如果数据的格式符合您的需要,如“2015-05-04”。
有关所需的位,请参阅文档,如创建视图并从中获取数据。

使用多部分键创建视图:

emit([doc.country,doc.city,doc.entrance_date], doc.name)
您的
doc.entry\u date
值应格式化为模式
YYYY-MM-DD
,以启用按时间顺序自动排序

请求用例:获取一个城市的最新用户

GET /dbname/_design/ddocname/_view/viewname?startkey=[":country",":city","\u0000"]&startkey=[":country",":city","\u9999"]&descending=true&limit=1
工作原理:

需要一个城市的全部文档。占位符
“\u0000”
(第一个Unicode字符)和
“\u9999”
(最后一个Unicode字符),确保此类请求不必指定精确的时间戳。由于一个城市的所有行都将按时间顺序从过去到现在自动排序,因此请求应通过
descending=true
请求反向排序。最后,
limit=1
只返回最新的行

请求用例:获取所有城市的最新用户

在用例中,每个城市必须执行一个请求。如果所有城市的所有用户都应该由CouchDB在一个响应中响应,那么视图必须减少


当您需要时,请在注释中要求对此用例进行更详细的解释。

我不确定是否正确理解。如果我像你说的那样做,我将在每个查询中得到2个文档:一个带有key doc.country,另一个带有key doc.city。。。我想得到这样的东西:希腊:-雅典:最后进入:约翰·史密斯-塞萨洛尼基:最后进入:比尔·巴特,-斯巴达:最后进入:亚当·威洛,德国:-柏林:最后进入:汉兹·古特-Munchen:上次输入:Gregor Schweinschteiger,-Dortmund:上次输入:Bastian Klose如何通过多次发射实现类似的效果?不是原始用户,而是对第2部分的类似请求感兴趣。我有一个类似的数据结构,设备id和交互时间。我需要得到每台设备与最后一个请求交互的时间。在我的答案写出来的时间,我会解释引入一个reduce步骤来获取该信息。但与此同时,CouchDB获得了
POST/{db}/\u find
端点,该端点提供了一种查询语言,可以非常灵活和轻松地获得此类结果。请调查一下