删除BerkeleyDB中的键值对

时间:2015-05-30 20:14:43

标签: dictionary key-value berkeley-db

有没有办法删除键值对,其中键以子字符串1开头,在BerkeleyDB中以子字符串2结尾而不遍历数据库中的所有键?

例如:

  

$ sub1 =“B015”;

     

$ sub2 =“5646”;

我想删除

  

$ key =“B015HGUJJ75646”

注意:保证$ sub1和$ sub2的组合只有一个键。

这可以通过获取DB的迭代器并检查条件的每个键来完成,但这对于大型DB来说非常低效。有没有办法在没有遍历整个数据库的情况下做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您正在使用RECNO数据库,那么您可能运气不好。但是,如果你可以使用BTREE,你有几个选择。

首先,也许最简单的方法是只迭代有意义的数据库部分。假设您正在使用默认密钥比较函数,则可以使用DB_SET_RANGE将起始光标(迭代器)定位在部分密钥字符串的开头。在您的示例中,这可能是"B0150000000000"。然后使用DB_NEXT向前扫描,依次查看每个键。当您找到要查找的密钥时,或者如果您找到的密钥不是以"B015"开头,那么您就完成了。

另一种适用于您的情况的技术是重新定义关键比较功能。如果你说,只有$ sub1和$ sub2的组合,那么你可能只需要比较这些键的部分以保证唯一性?以下是https://www2.informatik.hu-berlin.de/Themen/manuals/perl/DB_File.html的完整字符串比较示例(我假设您正在使用perl,仅使用上面提供的语法):

        sub Compare
        {
            my ($key1, $key2) = @_ ;

            "\L$key1" cmp "\L$key2" ;
        }

        $DB_BTREE->{compare} = 'Compare' ;

所以,如果你可以装备的东西只是比较起始和结束的四个字符,你应该能够将数据库迭代器直接放到你感兴趣的密钥上。

相关问题