首页 > 解决方案 > 由前缀 RocksDb 索引的反向迭代

问题描述

我目前正在为个人项目使用 RocksDB 数据库,我尝试以与我的数据库相反的顺序获取所有内容,该数据库由前缀索引。但是我无法为我的循环找到好的代码。我跌倒了,好像我错过了什么。这是我的代码:

    //My iterator is already created with the rocksdb::ReadOptions()
    rocksdb::Slice key{reinterpret_cast<const char *>(indexToFind), sizeof(indexToFind};
    std::vector<int> ids;

    it->SeekForPrev(key);
    auto currentKey = it->key();
    while(it->Valid() && it->key().starts_with(key)) {

        /* Some custom treatment here */

        it->SeekForPrev(it->key());
        it->Prev();
        currentKey = it->key();
    }

    if (!it->status().ok()) {
        std::cout << it->status().ToString() << std::endl;
    }
    assert(it->status().ok()); // Check for any errors found during the scan

提前干杯和感谢,克莱门特。

标签: c++rocksdb

解决方案


我不认为本机rocksdb支持使用前缀的反向迭代。您可以从他们的 wiki 中很好地找到 Prefix Seek API。以下是来自wiki的PrefixSeekAPI的限制,

前缀迭代不支持 SeekToLast()。SeekToFirst() 仅受某些配置支持。如果您要针对迭代器执行这些类型的查询,则应该使用总订单模式。

使用前缀迭代的一个常见错误是使用前缀模式以相反的顺序进行迭代。但目前还不支持。如果反向迭代是您常见的查询模式,您可以重新排序数据以将您的迭代顺序变为正向。您可以通过实现自定义比较器来实现,或者以不同的方式对密钥进行编码。

请参阅此处的 wiki


推荐阅读