mongodb - MongoDB 驱动程序分页
问题描述
目前,我可以从该系列中退回我所有的产品。但是,我希望能够返回特定产品 ID 之后的产品(这将是客户端的最后一个,因此它们可以加载更多)
当前方式(全部返回)
query := bson.M{}
var product ReturnedProdcut
var products []ReturnedProduct
cur, err := mg.Db.Collection("products").Find(c.Request().Context(), query)
if err != nil {
fmt.Println(err)
}
for cur.Next(c.Request().Context()) {
err := cur.Decode(&product)
if err != nil {
fmt.Println(err)
}
products = append(products, product)
}
// return products list in JSON format
return c.JSON(http.StatusOK, products)
新方式尝试(根据页面返回)
afterID := c.QueryParam("afterID")
if afterID == "" {
// get from start of collection based on latest date
}
// get 10 products after this ID, if no ID then get from start
query := bson.M{}
var product ReturnedProduct
var products []Returnedproduct
//.find(afterId).limit(10) - something like this?
cur, err := mg.Db.Collection("products").Find(c.Request().Context(), query)
if err != nil {
fmt.Println(err)
}
for cur.Next(c.Request().Context()) {
err := cur.Decode(&product)
if err != nil {
fmt.Println(err)
}
products = append(products, product)
}
// return products list in JSON format
return c.JSON(http.StatusOK, products)
解决方案
您可以构造一个_id
大于的查询afterID
,在这种情况下,您还应该指定按 排序_id
。对于排序和设置限制,您可以使用options.FindOptions
.
您还应该使用Cursor.All()
来解码所有结果,而不是一一解码。
这就是它的样子:
query := bson.M{"_id": bson.M{"$gt": afterID}}
opts := options.Find().
SetSort(bson.M{"_id": 1}).
SetLimit(10)
ctx := c.Request().Context()
curs, err := mg.Db.Collection("products").Find(ctx, query, opts)
if err != nil {
// Handle error
}
var products []Returnedproduct
if err = curs.All(ctx, &products); err != nil {
// Handle error
}
return c.JSON(http.StatusOK, products)
推荐阅读
- mysql - SQL 填充常量 Incase 连接两个表时不匹配
- javascript - 包装函数的示例 Jest 单元测试
- cordova - 适用于 iOS 和 Android 的智能手表通知 Cordova 插件
- c# - 邮递员将日期时间显示为未知格式
- php - 使用 Wordpress 中的查询字符串在 wp 查询中进行多个搜索查询
- asp.net - asp.net:如何与 javascript 交换信息?
- css - 如何在 Wordpress CSS 样式表中减少类
- c - 我能否确定与 FILE 关联的 stdio 用户空间读取缓冲区中有多少字节?
- maven - Apache Karaf WAR 文件部署不起作用。404-在浏览器上找不到
- linux - 无法在 AWS 上的 AMI linux EC2 实例上运行没有 sudo 的 Docker