LMDB Java使用相同的键检索所​​有值

时间:2018-07-19 13:44:45

标签: java database lmdb

我想用相同的键存储多个值。创建数据库时,请确保包含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);
    }
}

1 个答案:

答案 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)));
    }
  }