CouchDB - 在CouchDB中每50个文档获取一次

时间:2012-05-05 12:54:21

标签: couchdb

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

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

如何通过map / reduce函数获得此结果?

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

谢谢!

1 个答案:

答案 0 :(得分:3)

问题

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

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

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

// 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