?该模块很快就会被弃用,因为它已被
abstract-level
取代。
levelup(db[, options[, callback]])
db.supports
db.open([options][, callback])
db.close([callback])
db.put(key, value[, options][, callback])
db.get(key[, options][, callback])
db.getMany(keys[, options][, callback])
db.del(key[, options][, callback])
db.batch(array[, options][, callback])
(数组形式)db.batch()
(链式形式)db.status
db.isOperational()
db.createReadStream([options])
db.createKeyStream([options])
db.createValueStream([options])
db.iterator([options])
db.clear([options][, callback])
db.createWriteStream
发生了什么?快速而简单的存储。用于abstract-leveldown
兼容存储的 Node.js 包装器,遵循 LevelDB 的特征。
LevelDB 是 Google 构建的一个简单的键值存储。它用于 Google Chrome 和许多其他产品。 LevelDB 支持任意字节数组作为键和值、单个get 、 put和delete操作、批量 put 和 delete 、双向迭代器以及使用非常快的 Snappy 算法的简单压缩。
LevelDB 存储按键字典顺序排序的条目。这使得levelup
的流接口(将 LevelDB 迭代器公开为可读流)成为一种非常强大的查询机制。
最常见的存储是leveldown
,它提供了与 LevelDB 的纯 C++ 绑定。有许多替代存储可用,例如浏览器中的level.js
或用于内存存储的memdown
。它们通常支持键和值的字符串和缓冲区。对于更丰富的数据类型,您可以使用encoding-down
包装存储。
level
包是推荐的入门方式。它方便地捆绑了levelup
、 leveldown
和encoding-down
。它的主要导出是levelup
- 即你可以执行var db = require('level')
。
我们的目标是支持 Active LTS 和当前 Node.js 版本以及浏览器。有关底层商店的支持,请参阅相应的文档。
如果您要升级:请参阅UPGRADING.md
。
首先你需要安装levelup
!不包括任何商店,因此您还必须安装leveldown
(例如)。
$ npm install levelup leveldown
所有操作都是异步的。如果您不提供回调,则会返回 Promise。
var levelup = require ( 'levelup' )
var leveldown = require ( 'leveldown' )
// 1) Create our store
var db = levelup ( leveldown ( './mydb' ) )
// 2) Put a key & value
db . put ( 'name' , 'levelup' , function ( err ) {
if ( err ) return console . log ( 'Ooops!' , err ) // some kind of I/O error
// 3) Fetch by key
db . get ( 'name' , function ( err , value ) {
if ( err ) return console . log ( 'Ooops!' , err ) // likely the key was not found
// Ta da!
console . log ( 'name=' + value )
} )
} )
levelup(db[, options[, callback]])
创建新的levelup
实例的主要入口点。
db
必须是符合abstract-leveldown
存储。options
在打开时传递到底层存储,并且特定于所使用的存储类型调用levelup(db)
还将打开底层存储。这是一项异步操作,如果您提供回调,它将触发您的回调。回调应采用function (err, db) {}
的形式,其中db
是levelup
实例。如果您不提供回调,则任何读写操作都会在内部排队,直到存储完全打开,除非它无法打开,在这种情况下将发出error
事件。
这导致了管理levelup
实例的两种替代方法:
levelup ( leveldown ( location ) , options , function ( err , db ) {
if ( err ) throw err
db . get ( 'foo' , function ( err , value ) {
if ( err ) return console . log ( 'foo does not exist' )
console . log ( 'got foo =' , value )
} )
} )
与等价物对比:
// Will throw if an error occurs
var db = levelup ( leveldown ( location ) , options )
db . get ( 'foo' , function ( err , value ) {
if ( err ) return console . log ( 'foo does not exist' )
console . log ( 'got foo =' , value )
} )
db.supports
只读清单。可能会像这样使用:
if ( ! db . supports . permanence ) {
throw new Error ( 'Persistent storage is required' )
}
if ( db . supports . bufferKeys && db . supports . promises ) {
await db . put ( Buffer . from ( 'key' ) , 'value' )
}
db.open([options][, callback])
打开底层商店。一般来说,您不需要直接调用此方法,因为它是由levelup()
自动调用的。但是,可以在使用close()
关闭商店后重新打开商店。
如果没有传递回调,则返回一个承诺。
db.close([callback])
close()
关闭底层存储。回调将接收关闭期间遇到的任何错误作为第一个参数。
当您不再需要它来释放资源时,您应该始终通过调用close()
来清理您的levelup
实例。一个商店不能由多个levelup
实例同时打开。
如果没有传递回调,则返回一个承诺。
db.put(key, value[, options][, callback])
put()
是将数据插入存储的主要方法。就levelup
而言, key
和value
都可以是任何类型。
options
被传递到底层存储。
如果没有传递回调,则返回一个承诺。
db.get(key[, options][, callback])
通过key
从 store 获取一个值。 key
可以是任何类型。如果商店中不存在,则回调或 Promise 将收到错误。未找到的 err 对象的类型为'NotFoundError'
因此您可以err.type == 'NotFoundError'
或者您可以对属性err.notFound
执行真实测试。
db . get ( 'foo' , function ( err , value ) {
if ( err ) {
if ( err . notFound ) {
// handle a 'NotFoundError' here
return
}
// I/O or other error, pass it up the callback chain
return callback ( err )
}
// .. handle `value` here
} )
可选options
对象被传递到底层存储。
如果没有传递回调,则返回一个承诺。
db.getMany(keys[, options][, callback])
通过keys
数组从存储中获取多个值。可选options
对象被传递到底层存储。
如果操作因任何原因失败,则调用callback
函数时会出现Error
。如果成功,第一个参数将为null
,第二个参数将是与keys
顺序相同的值数组。如果未找到某个键,则相关值将为undefined
。
如果没有提供回调,则返回一个承诺。
db.del(key[, options][, callback])
del()
是从存储中删除数据的主要方法。
db . del ( 'foo' , function ( err ) {
if ( err )
// handle I/O or other error
} ) ;
options
被传递到底层存储。
如果没有传递回调,则返回一个承诺。
db.batch(array[, options][, callback])
(数组形式) batch()
可用于非常快速的批量写入操作( put和delete )。 array
参数应包含要顺序执行的操作列表,尽管它们作为一个整体在底层存储中作为原子操作执行。
每个操作都包含在具有以下属性的对象中: type
、 key
、 value
,其中类型为'put'
或'del'
。在'del'
的情况下, value
属性将被忽略。任何key
为null
或undefined
的条目都将导致callback
返回错误,并且任何类型: value
null
或undefined
的type: 'put'
条目都将返回错误。
const 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 ) return console . log ( 'Ooops!' , err )
console . log ( 'Great success dear leader!' )
} )
options
被传递到底层存储。
如果没有传递回调,则返回一个承诺。
db.batch()
(链式形式)当不带参数调用时, batch()
将返回一个Batch
对象,该对象可用于构建并最终提交原子批处理操作。根据其使用方式,在数组形式上使用batch()
的链式形式时可以获得更好的性能。
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[, options])
将当前批次的put操作放入队列,直到对该批次调用write()
后才提交。 options
参数(如果提供)必须是一个对象并传递到底层存储。
如果您的 put 存在问题(例如value
null
或undefined
),则此方法可能会throw
WriteError
。
batch.del(key[, options])
将当前批次上的del操作放入队列,直到对该批次调用write()
后才提交。 options
参数(如果提供)必须是一个对象并传递到底层存储。
如果删除出现问题,此方法可能会throw
WriteError
。
batch.clear()
清除当前批次上的所有排队操作,任何先前的操作都将被丢弃。
batch.length
当前批次的排队操作数。
batch.write([options][, callback])
提交该批次的排队操作。所有未清除的操作都将自动写入底层存储,也就是说,它们要么全部成功,要么全部失败,没有部分提交。
可选options
对象将传递给底层批处理对象的.write()
操作。
如果没有传递回调,则返回一个承诺。
db.status
只读字符串,是以下之一:
new
- 新创建的,未打开或关闭opening
- 等待底层商店打开open
- 成功开通商店,可供使用closing
- 等待商店关闭closed
- 商店已成功关闭。db.isOperational()
如果存储接受操作,则返回true
,在levelup
的情况下意味着status
为opening
或open
,因为它会自行打开并将操作排队直到打开。
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' )
} )
您可以提供一个选项对象作为createReadStream()
的第一个参数,具有以下属性:
gt
(大于)、 gte
(大于或等于)定义要流式传输的范围的下限。只有键大于(或等于)此选项的条目才会包含在范围中。当reverse=true
时,顺序将颠倒,但流式传输的条目将相同。
lt
(小于)、 lte
(小于或等于)定义要流式传输的范围的上限。只有键小于(或等于)此选项的条目才会包含在范围中。当reverse=true
时,顺序将颠倒,但流式传输的条目将相同。
reverse
(boolean, default: false
) : 以相反的顺序流条目。请注意,由于 LevelDB 等存储的工作方式,反向查找可能比正向查找慢。
limit
(number, default: -1
) : 限制该流收集的条目数量。该数字代表最大条目数,如果您首先到达范围末尾,则可能无法达到。值为-1
表示没有限制。当reverse=true
时,将返回具有最高键的条目而不是最低键的条目。
keys
(布尔值,默认值: true
) :结果是否应包含键。如果设置为true
且values
设置为false
,则结果将只是键,而不是具有key
属性的对象。由createKeyStream()
方法在内部使用。
values
(boolean, default: true
) :结果是否应包含值。如果设置为true
并且keys
设置为false
,则结果将只是值,而不是具有value
属性的对象。由createValueStream()
方法在内部使用。
db.createKeyStream([options])
返回键的可读流而不是键值对。使用与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([options])
返回可读的值流而不是键值对。使用与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.iterator([options])
返回一个abstract-leveldown
迭代器,它为上面的可读流提供动力。选项与createReadStream()
的范围选项相同,并传递到底层存储。
这些迭代器支持for await...of
:
for await ( const [ key , value ] of db . iterator ( ) ) {
console . log ( value )
}
db.clear([options][, callback])
删除所有条目或范围。不保证是原子的。接受以下范围选项(与迭代器具有相同的规则):
gt
(大于)、 gte
(大于或等于)定义要删除的范围的下限。只有键大于(或等于)此选项的条目才会包含在范围中。当reverse=true
时,顺序将相反,但删除的条目将是相同的。lt
(小于)、 lte
(小于或等于)定义要删除的范围的上限。只有键小于(或等于)此选项的条目才会包含在范围中。当reverse=true
时,顺序将相反,但删除的条目将是相同的。reverse
(boolean, default: false
) : 以相反的顺序删除条目。仅与limit
结合使用有效,删除最后 N 条记录。limit
(number, default: -1
) : 限制要删除的条目数。该数字代表最大条目数,如果您首先到达范围末尾,则可能无法达到。值为-1
表示没有限制。当reverse=true
时,具有最高键的条目将被删除,而不是最低键的条目。如果未提供任何选项,所有条目将被删除。如果操作成功,则将不带参数调用callback
函数;如果由于任何原因失败,则将调用WriteError
。
如果没有传递回调,则返回一个承诺。
db.createWriteStream
发生了什么? db.createWriteStream()
已被删除,以提供更小且更易于维护的核心。它的存在主要是为了与db.createReadStream()
创建对称性,但经过大量讨论,删除它是最好的做法。
其主要驱动力是性能。虽然db.createReadStream()
在大多数用例下表现良好, db.createWriteStream()
高度依赖于应用程序键和值。因此,我们无法提供标准实现并鼓励创建更多write-stream
实现来解决广泛的用例。
在此处查看社区已生成的实现。
如果省略回调,每个接受回调的函数都会返回一个承诺。唯一的例外是levelup
构造函数本身,如果没有传递回调,它将在后台延迟打开底层存储。
例子:
const db = levelup ( leveldown ( './my-db' ) )
await db . put ( 'foo' , 'bar' )
console . log ( await db . get ( 'foo' ) )
levelup
是一个EventEmitter
并发出以下事件。
事件 | 描述 | 论点 |
---|---|---|
put | 密钥已更新 | key, value (任意) |
del | 密钥已被删除 | key (任意) |
batch | 批次已执行 | operations (数组) |
clear | 条目已被删除 | options (对象) |
opening | 底层店铺即将开业 | - |
open | 商店已开业 | - |
ready | open 的别名 | - |
closing | 商店即将关门 | - |
closed | 商店已经关门了。 | - |
error | 发生错误 | error (错误) |
例如你可以这样做:
db . on ( 'put' , function ( key , value ) {
console . log ( 'inserted' , { key , value } )
} )
像 LevelDB 这样的存储是线程安全的,但它们不适合多进程访问。您应该只从单个 Node.js 进程打开商店。 Node.js 集群由多个进程组成,因此它们之间也不能共享levelup
实例。
请参阅Level/awesome
了解multileveldown
等模块,如果您需要跨进程共享单个商店,这些模块可能会有所帮助。
Level/levelup
是一个OPEN 开源项目。这意味着:
做出重大和有价值贡献的个人将获得对该项目的承诺访问权限,以做出他们认为合适的贡献。这个项目更像是一个开放的维基百科,而不是一个标准的受保护的开源项目。
有关更多详细信息,请参阅贡献指南。
跨浏览器测试平台和开源 ♥ 由 Sauce Labs 提供。
每月在 Open Collective 上捐款支持我们,并帮助我们继续我们的工作。
麻省理工学院