levelDB前置匹配查询方法
上一篇简单说了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 来判断是不是读取完成了) //读取完成后做的逻辑处理 }
其他的方法后续再补充,如果对你有用,请点击右下角广告支持,谢谢!