【问题标题】:CouchDB view collation sorted by date按日期排序的 CouchDB 视图排序规则
【发布时间】:2012-12-13 23:57:27
【问题描述】:

我正在使用 couchDB 数据库。

我可以按类别获取所有文档,并使用 ["category","document_id"]and a query likestartkey=["category","document_id"]&endkey=["category",{}] 之类的键对结果进行分页`

现在我想按日期对这些结果进行排序,以便首先获得最新的文档。

我尝试了很多键例如["category","date","document_id"] 但没有任何效果(或者我无法让它工作)。

我会使用类似的东西 startkey=["queried_category","queried_date","queried_document_id"]&endkey=["queried_category"]

但忽略“queried_date”关键部分(排序但不取“document_id”>“queried_document_id”的文档)

编辑: 例子 : 使用如下键: startkey=["apple","2012-12-27","ZZZ"]&endkey=["apple",{}]&descending=true

我会有(这是正常行为)

"apple","2012-12-27","ABC"
"apple","2012-05-01","EFG"
 ...
"apple","2012-02-13","ZZZ"
...

但是我想要的结果集应该以 "apple","2012-02-13","ZZZ"

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    发出类别和时间戳(您不需要 document_id):

    emit(category, timestamp);
    

    然后按类别过滤:

    ?startkey=[":category"]&endkey=[":category",{}]
    

    你必须明白这只是一种排序,所以你需要startkey在第一行之前,endkey在最后一行之后。

    最后但并非最不重要的一点是,不要忘记有一个足以满足排序要求的时间戳表示。

    【讨论】:

    • 如何在没有文档 ID 的情况下对结果进行分页?
    • 您可以使用skiplimit query parameters 进行分页
    • 我第一次使用ID是因为到处都说skip功能非常低效,不推荐使用。
    • 开发人员的口头禅是“先做简单,然后当它工作时,优化似乎是瓶颈的地方”。
    • 但我喜欢尽可能遵循最佳实践。当供应商说“不要使用”时,我会尽量避免
    【解决方案2】:

    使用时间戳而不是文档 ID 进行分页的问题是时间戳不是唯一的。这就是为什么您在分页 Aurélien 的解决方案时会遇到问题。

    我会保留您尝试的方法,但使用时间戳作为数字(自 1970 年以来的标准 UNIX 毫秒)。你可以通过乘以-1来反转单个数字字段的顺序:

    emit(category, -timestamp, doc_id)
    

    这种方式按字典顺序(升序)排序的结果将根据您的需要进行排序:

    1. 第一个日期降序,
    2. 然后文档 ID 升序。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 2012-09-11
      • 2011-12-26
      • 2016-10-03
      • 2013-04-04
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多