使用MongoDB时,是否有任何特殊模式可用于制作分页视图?说一个博客列出了10个最新帖子,你可以向后导航到较旧的帖子.
或者用例如blogpost.publishdate上的索引来解决它,然后跳过并限制结果?
我在Mongo的一个集合中有超过30万条记录.
当我运行这个非常简单的查询时:
db.myCollection.find().limit(5);
Run Code Online (Sandbox Code Playgroud)
它只需几毫秒.
但是当我在查询中使用skip时:
db.myCollection.find().skip(200000).limit(5)
Run Code Online (Sandbox Code Playgroud)
它不会返回任何内容......它会运行几分钟而不会返回任何内容.
如何让它变得更好?
我正在使用Mongoose 3.6,我的(简化的)模式如下所示
var commentSchema = new Schema({
created: Date
});
var userSchema = new Schema({
comments : [commentSchema],
});
Run Code Online (Sandbox Code Playgroud)
我想对评论进行分页,以便如果我的用户有25条评论,则页面将分为:
page 1: comments 15-24
page 2: comments 5-14
page 3: comments 0-4
page 4: empty
page 5: empty
...
Run Code Online (Sandbox Code Playgroud)
这就是我尝试过的
this.findById(user_id, {
comments: {
$slice: [-comment_page_index * comments_per_page, comments_per_page]
}
}, function(err, user) {
//...
});
Run Code Online (Sandbox Code Playgroud)
虽然起初似乎很有效,但令我失望的是,发现$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 …Run Code Online (Sandbox Code Playgroud) 我有由 20 到 500 个嵌套文档组成的父文档数组。如何限制每个父文档显示的嵌套文档的数量。
下面是我的文档和嵌套文档的结构。
[{
id
title
users: [{
user_id: 1,
timestamp: 2354218,
field3: 4
}, {
user_id: 1,
timestamp: 2354218,
field3: 4
}, {
user_id: 1,
timestamp: 2354218,
field3: 4
},
...
]
}, {
},
...
]
Run Code Online (Sandbox Code Playgroud)
我想限制每个父文档显示的用户数量。如何?
db.movies.aggregate(
[{$match: {
"movie_title": "Toy Story (1995)"}
},{
$lookup: {
from: "users",
localField: "users.user_id",
foreignField: "users.id",
as: "users"
}
},
{$project: {
movie_title: "$movie_title",
users: { $slice: [ "$users", 1 ] }
}}
]);
Run Code Online (Sandbox Code Playgroud)