Как огрганизовать хранение нескольких value в boltdb и поиск по ним?

BoltDB - это небольшая, встраиваемая база данных, написанная на языке программирования Go. Она предоставляет простой и эффективный способ организации хранения данных и обеспечивает высокую производительность при работе с ними.

Для хранения нескольких значений в BoltDB мы можем использовать структуру данных мап (map), где ключом будет служить уникальный идентификатор (ID), а значением будет сам объект с данными:

type Object struct {
	ID    int
	Name  string
	Value string
}

Для начала работы с BoltDB нам необходимо открыть базу данных и создать или открыть транзакцию:

db, err := bolt.Open("mydb.db", 0666, nil)
if err != nil {
    log.Fatal(err)
}
defer db.Close()

err = db.Update(func(tx *bolt.Tx) error {
    // ...
    return nil
})
if err != nil {
    log.Fatal(err)
}

Для создания или получения ведра (bucket) внутри транзакции используется метод CreateBucket или Bucket соответственно:

err = tx.Update(func(tx *bolt.Tx) error {
    bucket, err := tx.CreateBucketIfNotExists([]byte("myBucket"))
    if err != nil {
        return err
    }
    // ...
    return nil
})
if err != nil {
    log.Fatal(err)
}

Теперь мы можем добавить несколько объектов в наше ведро:

err = tx.Update(func(tx *bolt.Tx) error {
    bucket := tx.Bucket([]byte("myBucket"))

    obj1 := Object{ID: 1, Name: "Object 1", Value: "Value 1"}
    obj2 := Object{ID: 2, Name: "Object 2", Value: "Value 2"}

    encoded1, err := json.Marshal(obj1)
    if err != nil {
        return err
    }

    encoded2, err := json.Marshal(obj2)
    if err != nil {
        return err
    }

    err = bucket.Put([]byte("object:1"), encoded1)
    if err != nil {
        return err
    }

    err = bucket.Put([]byte("object:2"), encoded2)
    if err != nil {
        return err
    }

    return nil
})
if err != nil {
    log.Fatal(err)
}

Теперь, когда у нас есть объекты в базе данных, мы можем выполнять поиск по ним. Для этого мы можем использовать итераторы, чтобы перебрать все объекты в ведре и найти нужные нам значения:

err = db.View(func(tx *bolt.Tx) error {
    bucket := tx.Bucket([]byte("myBucket"))

    c := bucket.Cursor()
    for k, v := c.First(); k != nil; k, v = c.Next() {
        var obj Object
        err := json.Unmarshal(v, &obj)
        if err != nil {
            return err
        }
        
        // Здесь можно реализовать свою логику поиска по значениям объектов
        if obj.Name == "Object 1" {
            fmt.Printf("Found object: %+vn", obj)
        }
    }

    return nil
})
if err != nil {
    log.Fatal(err)
}

Код выше перебирает все ключи и значения в ведре, распаковывает JSON и проверяет нужные нам свойства объектов. В приведенном примере мы ищем объект с именем "Object 1".

Важно заметить, что в логике поиска можно использовать различные стратегии, такие как поиск по ключу, поиск по значению определенного поля и т. д. Это зависит от ваших потребностей и требований к приложению.

Надеюсь, этот ответ поможет вам начать работу с BoltDB, хранить несколько объектов и выполнять поиск по ним в Go.