levelup 4.x版本升级node.js下leveldb数据库对照文档

image.png


文章目录



levelup

是一个由谷歌构建的简单 key-value 数据库.
它在 Google Chrome 和许多其他产品中使用,使用 fast Snappy算法,可以将任意字节数组作为键和值.


leveldown

它提供了一个纯 C++ 绑定到 LevelDB.
在浏览器或者 memdown 中,有许多可选存储( 如 level.js ),用于内存存储中的. 它们通常支持键和值的字符串和缓冲区.
对于更丰富的数据类型集,可以用 encoding-down 包装存储.


level

它可以看做是包的一个集合,捆绑了 levelup , leveldown 和 encoding-down.
它的主要出口是 levelup - 换句话说,你可以 const db = require('level').

今天我们主要介绍levelup 4.x版本
levelup
开源地址:
http://www.github.com/Level/levelup

git://www.github.com/Level/levelup.git

levelup简介

快速,简单的存储k-v型存储数据库, 符合 LevelDB 特性的符合 node.js的存储的包装器.



支持的平台


支持活动的node.js 和当前版本以及浏览器


基本用法

安装 levelup ,没有包含存储,因此你还必须安装 leveldown

npm install levelup leveldown --save

如果你不提供回调,则返回一个承诺,将返回一个 Promise



API



levelup

( db [, options[, callback] ] )

创建新 levelup 实例的主要入口点.
db 必须是 abstract-leveldown 兼容存储.
options 被传递到底层存储.
调用 levelup(db) 也将打开底层存储,这是一个异步操作,如果你提供了一个,则会触发你的回调.
回调应采用窗体 function (err, db) {}db 是 levelup 实例。 如果不提供回调,任何读&写操作都只是在内部排队,直到存储完全打开.


db.open

db.open( [callback] )

一般情况下,不需要直接调用这里方法,因为它是由 levelup() 应用程序自动调用.
在使用 close() 关闭存储后,可以重新打开它,但通常不建议这样做.
如果未传递任何回调,则返回一个 promise


db.close

db.close( [callback] )

close() 用来关闭底层存储.
当你不再需要 close() 来释放资源时,你应该始终通过调用清理你的levelup 实例,
不能同时由多个 levelup 实例打开存储区.
如果未传递任何回调,则返回一个 promise


db.put

db.put(key, value [, options] [, callback] )

put() 是将数据插入存储区的主要方法。 对于 levelup,key 和 value 都可以是任何类型.
如果未传递任何回调,则返回一个 promise


db.get

db.get(key [, options] [, callback] )

get() 是从存储中获取数据的主要API.
key 支持任何类型, 如果value不存在,则回调或者promise将接收错误.
找不到err对象of类型为 'NotFoundError',这样你可以进行 err.type =='NotFoundError',或者你可以在属性 err.notFound 上执行truthy测试.

db.get('key', function (err, value) {
 if (err) {
 if (err.notFound) {
 // 扑捉错误
 }
 // I/O or other error, pass it up the callback chainreturncallback(err)
 }
 //返回value
 })

db.del

db.del(key [, options] [, callback] )

del 是从存储中删除数据的主要API

db.del('key', function (err) {
 if (err){
 // 处理错误
 }
 //删除成功
 });

db.batch

db.batch(array [, options] [, callback] ) ( array 表单)

batch 用于非常快速的批量写操作( put put delete delete delete delete ),
尽管 array 参数作为底层存储中的原子操作执行,但它们应该包含一个顺序执行的操作列表.
每个原子操作都包含在具有以下属性的对象中: type,key,value,
其中的类型为 'put' 或者 'del'.
在 'del'的情况下,value 属性被忽略.
如果定义了 key 和 value 但 type 不是,则默认为 'put'

var ops = [
 { type:'del', key:'father' },
 { type:'put', key:'name', value:'Yuri Irsenovich Kim' },
 { type:'put', key:'dob', value:'16 February 1941' },
 { type:'put', key:'spouse', value:'Kim Young-sook' },
 { type:'put', key:'occupation', value:'Clown' }
]db.batch(ops, function (err) {
 if (err) returnconsole.log('Ooops!', err)
 console.log('Great success dear leader!')
})

db.batch链式窗体

batch(),当使用无参数调用时,将返回一个可以用于构建和最终提交的Batch 对象.
根据使用方式,可以在将 batch()的链接形式与 array 形式一起使用时获得 GREATER 性能.

db.batch()
. del('father')
. put('name', 'Yuri Irsenovich Kim')
. put('dob', '16 February 1941')
. put('spouse', 'Kim Young-sook')
. put('occupation', 'Clown')
. write(function () { console.log('Done!') })

batch.put(key, value)

在当前批处理上排队,将操作放入当前批处理,直到在批处理上调用了 write() 时才提交,
如果输入( 例如 value,null 或者 undefined ) 出现问题,这里方法可能会 throwWriteError.

batch.del(key)

在当前批处理上对 del 操作排队,直到在批处理上调用 write() 时才提交,
如果删除时出现问题,则这里方法可能会 throwWriteError.

batch.clear()

清除当前批处理上的所有排队操作,所有以前的操作将被丢弃

batch.length

当前批处理上的排队操作数

batch.write([callback])

提交这里批处理的排队操作.
所有未清除的操作都将被自动写入底层存储,
即,它们要么全部成功,要么没有提交


db.isOpen()

levelup 实例可以处于以下状态之一:

  • "新建" - 新建的,未打开或者关闭
  • "打开" - 等待打开底层存储
  • "打开" - 成功打开了存储,可以供用户使用
  • "关闭" - 等待商店关闭
  • "已经关闭" - 存储已经成功关闭,不应使用
    isOpen() 仅在状态为"打开"时才返回 true

db.isClosed( )

如上,类似 isOpen()。
如果状态为"关闭"或者"已经关闭",则 isClosed() 将返回 true,这对于确定是否允许读取和写入操作非常有用.


db.createReadStream

db.createReadStream( [options] )

返回一个读取流 key-value 对.

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 ended')
 })

默认情况下,它将把基础存储中的所有条目都遍历.
使用下面描述的选项可以控制范围,方向和结果.
option选项作为 createReadStream()的第一个参数,具有以下属性

  • gt ( 大于),gte ( 大于或者等于) 定义要传输的范围的下限
    这里选项将包含键为 GREATER的项,这里选项将包括在范围内。 当 reverse=true 命令将反转,但流流将是相同的
  • lt ( 小于),lte ( 小于或者等于) 定义要传输的范围的上限
    只有密钥小于( 或者等于)的条目这里选项将包含在范围内. 当 reverse=true 命令将反转,但流流将是相同的
  • reverse ( 布尔值,默认值:false ): 反向顺序的流条目
    请注意,由于存储类似,工作的方式,反向寻找可以能比向前寻找更慢
  • limit ( 数字,默认值:-1 ): 限制此流收集的条目数
    这个数字表示最大数量如果到达范围的结尾,则不能达到 entries, -1 值表示没有限制, 当 reverse=true 时,将返回具有最高键的条目而不是最低键
  • keys ( 布尔值,默认值:true ): 结果是否应包含密钥
    如果设置为 true 和 values 设置为 false,则结果将只是键,而不是具有 key 属性的对象. 由 createKeyStream() 方法在内部使用
  • values ( 布尔值,默认值:true ): 结果是否应包含值.
    如果设置为 true 和 keys 设置为 false,结果将只是值,而不是带有 value 属性的对象。 由 createValueStream() 方法在内部使用

注意

历史版本中遗留的选项:
start: 使用 gte 替换
end: 使用 lte 替换


db.createKeyStream

db.createKeyStream( [options] )

返回一个键的可以读流,而不是 key-value 对.
使用与 createReadStream 相同的选项来控制范围和方向.
你还可以通过将选项对象传递给 createReadStream() 并将 keys 设置为 true 和 values 设置为 false 来获取此流, 结果是等价的;流在对象模式下运行.

db.createKeyStream()
. on('data', function (data) {
 console.log('key=', data)
 })// same as:db.createReadStream({ keys:true, values:false })
. on('data', function (data) {
 console.log('key=', data)
 })

db.createValueStream

db.createValueStream( [options] )

返回一个可以读的流值,而不是 key-value 对.
使用与 createReadStream 相同的选项来控制范围和方向.
你还可以通过将选项对象传递给 createReadStream() 并将 values 设置为 true 和 keys 设置为 false 来获取此流, 结果是等价的;流在对象模式下运行

db.createValueStream()
. on('data', function (data) {
 console.log('value=', data)
 })// same as:db.createReadStream({ keys:false, values:true })
. on('data', function (data) {
 console.log('value=', data)
 })

db.createWriteStream

为了提供更小更可以维护的内核,db.createWriteStream() 已经被删除
它主要存在于 db.createReadStream() 中,但是通过大量的讨论,移除它是最好的动作.
这个的主要原因是性能, 虽然 db.createReadStream() 在大多数用例下表现良好,但 db.createWriteStream() 高度依赖于应用程序键和值。 因此我们不能提供标准的实现,并鼓励创建更多的write-stream 实现来解决广泛的用例


Promise支持

LevelUp附带本机 Promise 支持.
如果省略回调,则每个采用回调的函数也可以作为保证使用, 这适用于:

  • db.get(key[, options])
  • db.put(key, value[, options])
  • db.del(key[, options])
  • db.batch(ops[, options])
  • db.batch().write()

惟一的例外是 levelup 构造函数本身,如果没有传递回调,则会延迟打开底层存储.

var db =levelup(leveldown('./yijiebuyi'));
db.put('foo', 'bar')
. then(function () { returndb.get('foo') })
. then(function (value) { console.log(value) })
. catch(function (err) { console.error(err) })

或者使用 async/await:

constmain=async () => {
 constdb=levelup(leveldown('./my-db'))
 awaitdb.put('foo', 'bar')
 console.log(awaitdb.get('foo'))
}


事件


levelup 是一个 EventEmitter 插件,并发出以下事件

  • put 插入 key, value ( 任意)
  • del 删除 key ( 任意)
  • Batch 批处理已经执行 operations ( array )
  • opening 底层商店正在打开
  • open 存储已经打开
  • ready open的别名
  • closing 存储正在关闭
  • closed 存储已经关闭

出自:levelup 4.x版本升级node.js下leveldb数据库对照文档

回到顶部