如何在lmdb中正确地插入重复的键?

4
根据文档 (https://lmdb.readthedocs.org/en/release/),使用dupsort参数调用 open_db() 应该可以允许将重复的键添加到lmdb数据库中。但是实际似乎并不是这样的情况,除非我误解了文档的意思,否则它仍然会覆盖值。
env = lmdb.open(path.join(directory, 'lmdb'), map_size=map_size)
db = env.open_db(dupsort=True)

with env.begin(db=db, write=True) as transaction:
    transaction.put(b'mykey', b'value1')
    transaction.put(b'mykey', b'value2')
    transaction.put(b'mykey', b'value3')

然而,当我遍历键值对时,它只显示最后一个值"value3"。

cursor = transaction.cursor()
for key, value in cursor.iternext(True, True):
    print(key, value)

iternext_dup() 似乎也没有按预期打印出值。我还尝试了 cursor.next(),它只返回一次 True,此外,transaction.stat() 显示 entries: 1


如果键相同,则可以将值添加为逗号分隔(或其他字符)字符串。 - Jaskaran Singh
2个回答

2
我发现了问题所在。文档不是很清晰,似乎dupsort不能在默认数据库上工作,需要通过open_db()创建一个新的数据库。
默认数据库的标志状态全部为false,并且没有办法改变标志的持久状态,因此无法对默认数据库进行dupsort操作。

E.g

env = lmdb.open(path, max_dbs=2)
# doing just env.open_db(dupsort=True) doesn't work
db = env.open_db('db2', dupsort=True)
...

1

查看 iternext_dup(keys=False, values=True) 方法

从文档中得知,

返回一个正向迭代器,该迭代器在调用 next_dup() 之前会产生当前键的当前值(“重复项”),并重复此操作,直到达到当前键的最后一个值。

仅适用于使用 dupsort=True 打开的数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接