我想用相同的键存储多个值。创建数据库时,请确保包含MDB_DUPSORT
标志。我也知道这限制了值的大小,但是在这种特定情况下,这不是问题。
当我想使用相同的键读取值时,我的问题开始了。我进行了搜索,但找不到关于如何执行此操作的明确答案。
所以基本上:如何使用相同的键检索所有值?
我使用lmdbjava从数据库读取/写入。
我尝试过此操作,但是迭代器继续按下一个键,并且在读取最后一个值时不会停止:
try(Txn<ByteBuffer> txn = env.txnRead()) {
CursorIterator<ByteBuffer> cursor = db.iterate(txn, KeyRange.atLeast(key));
for(CursorIterator.KeyVal<ByteBuffer> kv : cursor.iterable()) {
ByteBuffer value = kv.val();
byte[] bytes = new byte[value.remaining()];
value.get(bytes);
System.out.println(bytes);
}
}
答案 0 :(得分:1)
而不是根据Javadoc的KeyRange.atLeast
从传递的键(或其后的第一个键)开始,然后 向前迭代直到没有键为止
我认为您想使用KeyRange.closed
在传递的键之间向前迭代,与第一个键匹配 直接等于传递的密钥(或紧随其后的 “开始”键的情况,或者在 “停止”键)。
测试
@Test
public void dupSortKeyRange() {
final Dbi<ByteBuffer> db = env.openDbi(DB_1, MDB_CREATE, MDB_DUPSORT);
try (Txn<ByteBuffer> txn = env.txnWrite()) {
db.put(txn, bb(5), bb(6));
db.put(txn, bb(5), bb(7));
db.put(txn, bb(5), bb(8));
db.put(txn, bb(6), bb(9));
txn.commit();
}
try (Txn<ByteBuffer> txn = env.txnRead()) {
ByteBuffer key = bb(5);
List<Integer> keyValues = new ArrayList<>();
CursorIterator<ByteBuffer> cursor = db.iterate(txn, KeyRange.closed(key, key));
for (CursorIterator.KeyVal<ByteBuffer> kv : cursor.iterable()) {
ByteBuffer value = kv.val().get(new byte[kv.val().remaining()]);
keyValues.add(value.getInt(0));
}
assertEquals(3, keyValues.size(), 0);
assertTrue(keyValues.containsAll(Arrays.asList(6, 7, 8)));
}
}