相关疑难解决方法(0)

使用mgo在MongoDB中进行高效分页

我已经搜索过,并没有找到问题的Go解决方案,没有使用或不使用mgo.v2,不是在StackOverflow而不是在任何其他网站上.此问答是本着知识共享/记录的精神.


假设我们users在MongoDB中有一个使用此Go建模的集合struct:

type User struct {
    ID      bson.ObjectId `bson:"_id"`
    Name    string        `bson:"name"`
    Country string        `bson:"country"`
}
Run Code Online (Sandbox Code Playgroud)

我们希望根据某些条件对用户进行排序和列出,但由于预期的长结果列表而实施了分页.

为了实现某些查询的结果的分页,MongoDB的和mgo.v2驱动包内置了支持的形式Query.Skip()Query.Limit(),例如:

session, err := mgo.Dial(url) // Acquire Mongo session, handle error!

c := session.DB("").C("users")
q := c.Find(bson.M{"country" : "USA"}).Sort("name", "_id").Limit(10)

// To get the nth page:
q = q.Skip((n-1)*10)

var users []*User
err = q.All(&users)
Run Code Online (Sandbox Code Playgroud)

然而,如果页面数量增加,这会变慢,因为MongoDB不能"神奇地"跳转到结果中的第x 文档,它必须遍历所有结果文档并省略(不返回)x需要的第一个文档.跳过.

MongoDB提供了正确的解决方案:如果查询对索引进行操作(它必须处理索引),cursor.min()则可以使用指定第一个索引条目来开始列出结果.

这个Stack Overflow答案展示了如何使用mongo客户端完成它:如何使用MongoDB中的范围查询进行分页?

注意:上述查询所需的索引是: …

pagination go mongodb mongodb-query mgo

8
推荐指数
1
解决办法
6648
查看次数

标签 统计

go ×1

mgo ×1

mongodb ×1

mongodb-query ×1

pagination ×1