levelup 4.x版本升级node.js下leveldb数据库对照文档
文章目录
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 存储已经关闭