Node.js 在leveldb上按值查找

Node.js 在leveldb上按值查找,node.js,database,key-value-store,leveldb,Node.js,Database,Key Value Store,Leveldb,我一直在玩leveldb,它非常擅长它的设计用途——根据键存储和获取键/值对 但现在我想做一些更高级的事情,发现自己马上就被卡住了。没有办法按值查找记录吗?我能想到的唯一方法是遍历整个数据库,直到找到一个具有我要查找的值的条目。如果我要查找多个具有该值的条目(基本上是一个“where”查询),则情况会变得更糟,因为每次尝试执行此类查询时,我都必须遍历整个数据库 我是否在尝试做Leveldb设计不具备的工作,是否应该使用另一个数据库?还是有一个好的方法可以做到这一点?你是对的。基本上,您需要了解的

我一直在玩leveldb,它非常擅长它的设计用途——根据键存储和获取键/值对

但现在我想做一些更高级的事情,发现自己马上就被卡住了。没有办法按值查找记录吗?我能想到的唯一方法是遍历整个数据库,直到找到一个具有我要查找的值的条目。如果我要查找多个具有该值的条目(基本上是一个“where”查询),则情况会变得更糟,因为每次尝试执行此类查询时,我都必须遍历整个数据库


我是否在尝试做Leveldb设计不具备的工作,是否应该使用另一个数据库?还是有一个好的方法可以做到这一点?

你是对的。基本上,您需要了解的是关键组成部分

其次,在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

您是对的。基本上,您需要了解的是关键组成部分

其次,在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

您使用哪个库与leveldb交互?也许我可以将我的答案更新为DirectJavaScript API。FWIW,wiredtiger使使用键值存储变得更容易您使用什么库与leveldb交互?也许我可以将我的答案更新为DirectJavaScript API。FWIW,wiredtiger使使用键值存储变得更容易我不确定我是否理解正确,但这是否意味着我必须为我需要进行此类查询的所有条目创建反向索引?是的。你必须去做,再问一个简单的问题。这是使用LevelDB时的常见做法吗?或者你只是提出了一个解决这个问题的方案。我想我很好奇,如果我试图用LevelDB做错误的用途,而不是用这种方式(我应该用另一种类型的DB)。好吧,LevelDB是低级别的,键组合是一种必须付诸实践的模式,以在键/值范式之上开发高级模式我给出了一个键组合的示例,用于在单个kv中存储多个表(通过名称空间)和按属性索引值(也称为二级索引)。所有这些都是密钥合成的一个实例。我不确定我是否理解正确,但这是否意味着我必须为我需要进行此类查询的所有条目创建反向索引?是的。你必须去做,再问一个简单的问题。这是使用LevelDB时的常见做法吗?或者你只是提出了一个解决这个问题的方案。我想我很好奇,如果我试图用LevelDB做错误的用途,而不是用这种方式(我应该用另一种类型的DB)。好吧,LevelDB是低级别的,键组合是一种必须付诸实践的模式,以在键/值范式之上开发高级模式我给出了一个键组合的示例,用于在单个kv中存储多个表(通过名称空间)和按属性索引值(也称为二级索引)。所有这些都是键合成的一个实例。