这个很贵吗?使用 mongodb 时使用 _id 跳过

Is it expensive? when using mongodb skip with _id

我预计这次查询并不昂贵

db.someCollection.find({}).skip(400000).limit(100);

因为,它会被“_id”索引,所以它可以直接使用索引访问文档。

但这可能是错误的。通过关注 mongodb 文档, http://docs.mongodb.org/manual/reference/method/cursor.skip/

为什么跳过操作很昂贵?

带有大参数的

skip 可能很昂贵,因为 MongoDB 必须查询所有满足 .find 命令的文档,然后跳过其中的 400k。您的文档越大,此操作的成本就越高。

skip 无法利用索引,但您可以按照能够非常有效地执行 一些 查询的方式构建索引。

例如,您可以进行分页查询。考虑 post 的集合,其中 dt 是创建日期:

{
 _id: ...
 dt: 123321123, // this is timestamp
 title: "asdf",
 ...
}

在这种情况下,如果您想获取下一页对象,您应该使用最后 post 的 dt 来预过滤文档:

db.posts.find({dt: {gt: 123321123}}).sort({dt: 1}).limit(100)

_id 的索引也是 "some kind of" 顺序的,但不能保证。将 _id 视为适合访问随机文档而不是序列的索引。