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 来判断是不是读取完成了)
            //读取完成后做的逻辑处理
        }

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

回到顶部