【问题标题】:Getting first element in each group in couchDB在couchDB中获取每个组中的第一个元素
【发布时间】:2015-05-05 18:16:54
【问题描述】:

我有这样的问题。假设我在 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 中,我会执行诸如连接分组和多项选择之类的操作……但在这里我被卡住了。如何做到这一点最有效?

【问题讨论】:

    标签: mapreduce couchdb


    【解决方案1】:

    使用多部分键创建视图:

    emit([doc.country,doc.city,doc.entrance_date], doc.name)
    

    您的doc.entrance_date 值应格式化为YYYY-MM-DD 模式,以启用按时间顺序自动排序。

    Request-Use-Case:获取一个城市的最新用户

    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 只返回最新的行。

    Request-Use-Case:获取所有城市的最新用户

    在每个城市必须完成一个请求之前的用例中。如果所有城市的所有用户都应由 CouchDB 一次响应,则必须减少视图。

    如果需要,请在评论中要求对此用例进行更详细的解释。

    【讨论】:

    • 不是原始用户,但对第 2 部分的类似请求感兴趣。我有类似的数据结构、设备 ID 和交互时间。我需要获取每个设备在 1 个请求中最后一次交互的时间。
    • 在我写答案的时候,我会解释引入减少步骤来获取该信息。但与此同时,CouchDB 获得了POST /{db}/_find 端点,它提供了一种查询语言,可以非常灵活和轻松地获得这样的结果。请查看docs.couchdb.org/en/stable/api/database/find.html
    【解决方案2】:

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

    emit([doc.entrance_date, doc.country], doc.name);
    emit([doc.entrance_date, doc.city], doc.name);
    

    生成的视图将自动按数据对结果进行排序,前提是该格式可根据您的需要进行排序,例如“2015-05-04”。 有关所需位的信息,请参阅文档,例如创建视图并从中获取数据。

    【讨论】:

    • 我不确定我的理解是否正确。如果我按照您所说的那样做,我将在每个查询中得到 2 个文档:一个带有关键 doc.country 第二个带有关键 doc.city... 我想得到这样的东西:Greece:-雅典:最后进入:John Smith -Thessalloniki:最后进入:Bill Bucket,-Sparta:最后进入:Adam Willow,德国:-柏林:最后进入:Hanz Gutt。 -Munchen:最后进入:Gregor Schweinschteiger,-Dortmund:最后进入:Bastian Klose 如何通过多次发射实现这样的效果?
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多