我一直在玩leveldb并且它非常擅长于它的设计目的 - 根据键存储和获取键/值对。
但现在我想做一些更高级的事情,发现自己立即陷入困境。有没有办法按价值找到记录?我能想到的唯一方法是迭代整个数据库,直到找到一个值为I' m的条目。如果我正在寻找具有该值的多个条目(基本上是"其中"查询),这会变得更糟,因为每次我尝试执行此类查询时都必须遍历整个数据库。 / p>
我是否正在努力做Leveldb没有设计的事情,我应该使用其他数据库吗?或者有一个很好的方法来做到这一点?
答案 0 :(得分:1)
你是对的。基本上你需要知道的是关键成分。
其次,您不是在SQL WHERE
子句中按值本身进行查询,而是使用类似age = 42
的布尔查询。
要回答你的特殊问题,想象一下你在leveldb中有一个第一个键值命名空间,你可以在那里存储你的对象,例如在json中序列化值:
key | value
-------------------------------------------------
namespace | uid | value
================================================
users | 1 | {name:"amz", age=32}
------------------------------------------------
users | 2 | {name:"abki", age=42}
在另一个名称空间中,您可以按年龄索引用户uid:
key | value
----------------------------------
namespace | age | uid | value
==================================
users-by-uid | 32 | 1 | empty
----------------------------------
users-by-uid | 42 | 2 | empty
此处值为空,因为键必须是唯一的。我们可以认为给定行的值是它组成的uid
列
进入密钥,使每一行的密钥唯一。
在第二个命名空间中,以 (user-by-uid, 32)
开头的每个键匹配回答查询age = 32
的记录。