【发布时间】:2013-05-21 02:44:45
【问题描述】:
我使用的是 Mongoose 3.6,我的(简化的)架构看起来像这样
var commentSchema = new Schema({
created: Date
});
var userSchema = new Schema({
comments : [commentSchema],
});
我想对 cmets 进行分页,这样如果我的用户有 25 个 cmets,页面将分为:
page 1: comments 15-24
page 2: comments 5-14
page 3: comments 0-4
page 4: empty
page 5: empty
...
这是我尝试过的
this.findById(user_id, {
comments: {
$slice: [-comment_page_index * comments_per_page, comments_per_page]
}
}, function(err, user) {
//...
});
虽然起初这似乎可行,但我很失望地发现 $slice 运算符会在达到集合边界时切断给定的索引。
所以我得到的是
page 1: comments 15-24
page 2: comments 5-14
page 3: comments 0-9
page 4: comments 0-9
page 5: comments 0-9
...
这里更好的选择可能是结合sort、skip 和limit 函数,但是虽然我知道如何在常规集合中使用它们,但我必须知道如何将它们应用于子文档.有什么想法吗?
【问题讨论】:
-
可能最好不要将所有 cmets 都嵌入到用户中 - 活跃用户会使文档无限增长,这对性能来说不是一个好主意。
-
谢谢你的建议,我会考虑的。无论如何,我想知道是否存在一种对子文档进行分页的方法,而无需重构整个结构
-
您可以使用聚合框架 - $unwind 子文档数组,然后使用 $sort 和 $limit。
-
这似乎是要走的路。如果您想举个例子并将其放在答案中,我将不胜感激:)无论如何我都会自己尝试
标签: mongodb pagination mongoose