首页 > 解决方案 > 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)

标签: mongodbgoechomongo-go

解决方案


您可以构造一个_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)

推荐阅读