0 Вопрос: почему leveldb сортирует ключи при вставке?

вопрос создан в Thu, May 2, 2019 12:00 AM

Я пытаюсь вставить данные в базу данных leveldb с ключом в виде строки, затем пытаюсь получить последний ключ, но проблема в том, что когда я вставляю от 1 до 11 ключей в формате строки, leveldb размещает их как строку и возвращает неправильные данные, поэтому Мне нужен способ запретить сортировку данных leveldb без изменения формата ключа

//this is the struct 

values := [10]DataStruct{
        {Index: "1"},{Index: "2"},{Index: "3"},{Index: "5"},
        {Index: "6"},{Index: "7"},{Index: "8"},{Index: "9"},
        {Index: "10"},{Index: "11"},
    }
//this is insert func 
func Create(data DataStruct) bool {
    Opendatabase() //open database 
    d, convert := marshaltobson(data) // convert to []byte
    if !convert {
        return false
    }
    err := db.Put([]byte(data.Index), d, nil)
    if err != nil {
        return false
    }
    Closedatabase()
    return true
}

// this is get all function 

func GetAll() (values []DataStruct) {
    Opendatabase() 
    iter := db.NewIterator(nil, nil)
    for iter.Next() {

        value := iter.Value()
        var newdata DataStruct
        json.Unmarshal(value, &newdata)
        values = append(values, newdata)
    }
    Closedatabase()
    return values
}
//func to get last key 
func Getlast() (Structlst DataStruct) {
    Opendatabase()

    var result DataStruct
    iter := db.NewIterator(nil, nil)
    iter.Last()
    value := iter.Value()
    json.Unmarshal(value, &result)
    Closedatabase()

    return result
}

var err bool
    for i := 0; i < len(values); i++ {

        err = Errordb.Create(values[i])
        if err {
            fmt.Println("worked")
        }
    }

    fmt.Println("---------------------------------- ")
    fmt.Println("get all data in database :- ")
    fmt.Println("---------------------------------- ")
    value := GetAll()
    for i := 0; i < len(value); i++ {
        fmt.Println(value[i])
        fmt.Println("")
    }
    fmt.Println("---------------------------------- ")
    fmt.Println("get last :- ")
    fmt.Println("---------------------------------- ")
    value1 := Getlast()
// this is the output 
---------------------------------- 
get all data in database :- 
---------------------------------- 
{1}
{10}
{11}
{2}
{3}
{5}
{6}
{7}
{8}
{9}
---------------------------------- 
get last :- 
---------------------------------- 
{9}
    
- 1
  1. Вы можете предоставить ваш собственный порядок , но это может быть неправильная БД, если все ваши ключи числовые.
    2019-05-02 15: 21: 19Z
  2. iterator.Iterator документирует, что пары возвращаются в ключевом порядке, а порядок строк, содержащих десятичные числа, не совпадает с порядком натуральных чисел. Вы можете обойти это, если вы используете фиксированную ширину для чисел, например, "00001", "00002" ... "00011", но вам следует подумать и об использовании чего-то еще, если вы собираетесь использовать свою БД в таком виде.
    2019-05-02 15: 26: 43Z
  3. Я не думаю, что levelDB сортирует их, но вы предоставляете неверную информацию. Если вы используете 01, 02, ... 10, 11, вы, вероятно, увидите, что он не отсортирован в базе данных.
    2019-05-02 15: 29: 40Z
  4. Неважно, сортируется ли база данных или нет, мне нужно получить последние введенные данные, безотносительно к типу ключа, в моем случае итератор бесполезно, поэтому, если вы знаете какой-либо другой способ, скажите, пожалуйста, фиксированная ширина - это решение, которое я знаю, но что, если мне нужно, чтобы этот ключ генерировался автоматически, алгоритм будет сложным, мне нужен более эффективный способ
    2019-05-05 17: 07: 59Z
0 ответов                              0                         
источник размещен Вот