跳到主要内容

levelDB前置匹配查询方法

· 阅读需 3 分钟
一介布衣
全栈开发者 / 技术写作者

上一篇简单说了**levelDB存储复杂数据结构 里面介绍了nosql 方式下kv数据如何存储复杂数据结构.今天用实例的方法说明下调用levelDB api的方法,因为一介布衣** 博客就是就是使用node.js 和 levelDB搭建而成,所以今天还是用此博客来举例说明.

需要结合上一篇来学习,关于levelDB的api我简单做了一个封装,看这篇文章levelup的使用方法 里面的 get ,put ,delete 都非常好理解,就是根据key去查询value ,插入一对key和value ,根据key删除value.

createReadStream 方法可能不是特别好理解,在levelDB存储复杂数据结构中讲到用前置匹配的方法来查询索引正是用到了createReadStream 方法.

回顾一下,我库里有如下key-value 键值对

abc --> 111

abd --> 333

abm --> 777

abw --> 999

那么我可以用createReadStream方法查询出以 ab开头的key 对应的所有value,安装key的读取顺序把value一个一个返回.我们贴出createReadStream调用代码:

db.createReadStream()
.on('data', function (data) { console.log(data.key, '=', data.value)
})
.on('error', function (err) { console.log('Oh my!', err)
})
.on('close', function () { console.log('Stream closed')
})
.on('end', function () { console.log('Stream closed')
})

它监听了一个读取流,要触发如下事件

on('data' 将读取到的value按照读取顺序返回.

on('error' 发生错误时要做什么

on('close' 关闭流时要做什么

on('end' 流结束时做什么

其实这个api可以接受一个参数,参数可以指定key的开始位置 ,结束位置,然后就可以做到前置匹配,我把此方法封装了一下,在levelup使用方法一文中已经贴出了代码,下面再单独把此方法的封装贴一下

function find(putoption, callback) {
var option = {keys: true, values: true, revers: false, limit: 20, fillCache: true};
if (!putoption)
return callback('nothing', null);
else {
if (putoption.prefix) {
option.start = find.prefix;
option.end = find.prefix.substring(0, find.prefix.length - 1)
+ String.fromCharCode(find.prefix[find.prefix.length - 1].charCodeAt() + 1);
}

if (putoption.limit)
option.limit = find.limit;

db.createReadStream(option).on('data',function (data) {
data&&callback(data.key, data.value);
}).on('error',function (err) {
}).on('close',function () {
}).on('end', function () {
return callback(null, Date.now());
});
}
}

putoption 是外部出入的参数对象, option 是内部组合的参数对象, createReadStream 可以指定读取key的开始位置(如 option.start ),结束位置(option.end ),以及读取多少条记录 (option.limit)

再看如下数据库记录

abc --> 111

abd --> 333

abm --> 777

abw --> 999

调用方法

var levelup = require('levelup');
var db = levelup('./yijiebuyi');

var option-{prefix:'ab',limit:2};
db.find(option, function (key, value) {
if (key && value) {
//key 和 value 都存在的情况下进行逻辑处理
//依次返回 key:abc ,value :111 和 key:abd ,value :333 (因为我限制只读取2条记录)
} else {
//如果读到最后一个 value 将会是 undefined (这是leveldb自己实现的一种机制,所以我们可以根据 value==undefined 来判断是不是读取完成了)
//读取完成后做的逻辑处理
}

其他的方法后续再补充,如果对你有用,请点击右下角广告支持,谢谢!