由于某些原因,我需要在couchdb中获取每50个文档。
例如,我的数据库中有500个用户,我想要获取第一个,第51个,第101个......第451个用户。
如何通过map / reduce函数获得此结果?
(我知道我可以在url中设置“skip”参数来执行类似的行为,但我想通过map / reduce来实现)
谢谢!
答案 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
?descending=true&limit=1&skip=50
?descending=true&limit=1&skip=100