使用 BoltDB 按顺序存储和检索项目

问题描述 投票:0回答:1

我将 BoltDB 与 Golang 结合使用,想要存储然后按照放入数据库的顺序检索我的项目。

我正在使用

设置项目
func (r *Bolt) Set(key string, value []byte) error {
    return r.Client.Update(func(tx *bolt.Tx) error {
        b := tx.Bucket([]byte(r.bucket))
        return b.Put([]byte(key), value)
    })
}

然后我尝试获取所有项目并使用限制返回前 10 个。

// GetAll will fetch the latest n record from Bolt, up to the limit supplied.
func (r *Bolt) GetAll(limit int) ([][]byte, error) {
    var results [][]byte

    if err := r.Client.View(func(tx *bolt.Tx) error {
        b := tx.Bucket([]byte(r.bucket))
        if b == nil {
            return fmt.Errorf("bucket %s not found", r.bucket)
        }

        // Set the cursor to the last key in the bucket
        c := b.Cursor()
        lastKey, _ := c.Last()

        // Iterate over the data in descending order, starting from the last key
        for k, v := c.Seek(lastKey); k != nil; k, v = c.Prev() {
            results = append(results, v)

            // Return if we have collected 50 items
            if len(results) >= limit {
                break
            }
        }

        return nil
    }); err != nil {
        return nil, err
    }

    return results, nil
}

如果我在数据库中使用以下键

test1
test2, 
test3
, 
test4`,它们似乎总是以随机顺序检索。

有什么方法可以保证 BoltDB 中项目的顺序吗?

我正在保存的数据上有一个

createdAt
时间字段,我想我可能会使用它,但这意味着我必须检索所有项目然后进行排序。

go boltdb
1个回答
0
投票

你可以。您的代码中有逻辑错误。您应该使用 c.First() 方法而不是 c.Seek() 或 c.Last() 根据 documentation

来执行此操作
© www.soinside.com 2019 - 2024. All rights reserved.