【问题标题】:CouchDB - fetch every 50 doc in CouchDBCouchDB - 在 CouchDB 中获取每 50 个文档
【发布时间】:2012-05-05 12:54:21
【问题描述】:

由于某些原因,我需要在我的 couchdb 中获取每 50 个文档。

例如,我的数据库中有 500 个用户,我想获取第一个、第 51 个、第 101 个....第 451 个用户。

如何通过 map/reduce 函数得到这个结果?

(我知道我可以在 url 中设置“skip”参数来执行类似的行为,但我想通过 map/reduce 来实现)

谢谢!

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    问题

    要记住的关键是CouchDB map/reduce 更像CREATE INDEX...,而不像SELECT * FROM...

    Map/reduce 创建一个静态行列表。行可以按您想要的任何顺序排列(按您发出的 key 排序),但一个文档不可能更改另一个文档的结果

    为了说明这一点,假设您有一个这样的行的假设视图。键是他们在列表中的“位置”,值是用户名

    // View rows (conceptual diagram only)
    // Key, Value
    0     , "mark" // Suppose Alice was created first, 1 week ago
    1     , "bob"  // and Bob was created 1 day ago
    2     , "evan" // and Evan was created 1 hour ago... so this view is chronological
    ... // etc.
    

    现在您意识到 Bob 的文档有一个错误。他实际上在一年前签约,而不是一天前。你更新他的时间戳。视图现在应该如何?

    // View rows (conceptual diagram only)
    // Key, Value
    0     , "bob"  // The corrected Bob document was created 1 **year** ago
    1     , "mark" // ...and now Mark scoots down to the next position (!!!)
    2     , "evan" // ...and Evan stayed the same
    ... // etc.
    

    问题出在:在 CouchDB 中,如果只更改 Bob 的文档,不可能影响 Mark 的行。这就是基本架构。上面的(!!!) 标签表示不可能的功能。问题在于我们最初的假设:我们可以有一个视图来指示行之间相对绝对位置。 (注意,relative 一词与 relational 词根相同,如“关系数据库”)

    所以这样的技术是不可能的,通过减少荒谬。

    解决方案

    您可以使用 map/reduce 完成大部分您需要的事情。代替假设的 位置 作为键,使用 timestamp 作为键。

    // View rows (conceptual diagram only)
    // Key, Value
    2011-05-06, "bob"  // Bob signed up one year ago
    2012-05-05, "mark" // Mark signed up one day ago
    2012-05-06, "evan" // Evan one hour ago
    ... // etc.
    

    当然,时间戳格式只是为了做一个清楚的例子。您可能应该使用 ISO 8601 格式(即您从 JavaScript 中的 JSON.stringify(new Date) 获得的内容)。

    要获得最新的注册,请对视图进行降序查询;如果只获取一行,请使用limit 选项。

    • 获取最新注册:?descending=true&limit=1
    • 要获得第 50 个最新的:?descending=true&limit=1&skip=50
    • 要获得第 100 个最新的:?descending=true&limit=1&skip=100

    【讨论】:

    • 我想用更新的时间对我的文档进行排序,并获取最新的、第 51 个最新的......用户。在 MySQL 等关系数据库的 ORM 中,我可以通过以下方式执行此操作: 1. 按时间对数据进行排序 2. User.find(0), User.find(50)
    • 太棒了!我已经更新了我的答案,以便以 CouchDB 的最佳方式解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多