【问题标题】:MongoDB driver paginationMongoDB 驱动程序分页
【发布时间】:2020-12-15 18:21:09
【问题描述】:

目前我可以退回我收藏的所有产品。 但是,我希望能够返回特定产品 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)

【问题讨论】:

    标签: mongodb go mongo-go


    【解决方案1】:

    您可以构造一个查询,其中_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)
    

    【讨论】:

    • 我的 id 是primitive.ObjectID,所以我假设它们不能按数字排序?
    • @Henry ObjectID是有序的,可以排序,大致相当于时间顺序(秒精度)。
    【解决方案2】:

    官方MongoDB Go driver 也有一个*FindOptions 可选参数,你也可以探索一下。

     pageOptions := options.Find()
     pageOptions.SetSkip(int64(page)) //0-i
     pageOptions.SetLimit(int64(limit)) // number of records to return
    
     cur, err := userCollection.Find(c.Request().Context(), bson.D{{}}, pageOptions)
     if err != nil {
        // handle error
     }
    
     defer cur.Close(ctx)
     var products []Returnedproduct
     for cur.Next(c.Request().Context()) {
        var product Returnedproduct
        if err := cur.Decode(&product); err != nil {
            // handle error
        }
        products = append(products, &product)
     }
    
     if err := cur.Err(); err != nil {
        // handle error
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2016-12-07
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多