被classic-level取代。请查看常见问题。
db = leveldown(location)db.open([options, ]callback)optionsdb.close(callback)db.put(key, value[, options], callback)optionsdb.get(key[, options], callback)optionsdb.getMany(keys[, options][, callback])db.del(key[, options], callback)optionsdb.batch(operations[, options], callback) (数组表单)db.batch() (链式形式)db.approximateSize(start, end, callback)db.compactRange(start, end, callback)db.getProperty(property)db.iterator([options])db.clear([options, ]callback)chainedBatchchainedBatch.put(key, value)chainedBatch.del(key)chainedBatch.clear()chainedBatch.write([options, ]callback)chainedBatch.dbiteratorfor await...of iteratoriterator.next([callback])iterator.seek(key)iterator.end([callback])iterator.dbleveldown.destroy(location, callback)leveldown.repair(location, callback)该模块最初是levelup的一部分,但后来被提取,现在用作LevelDB的独立结合。
强烈建议您leveldown使用levelup ,除非您有可衡量的绩效理由这样做。 levelup针对可用性和安全性进行了优化。尽管我们正在努力提高leveldown接口的安全性,但如果您不以正确的方式进行操作,则很容易崩溃您的节点过程。
有关leveldown不安全操作的详细信息,请参见下面的安全部分。
我们旨在支持至少有效的LT和当前的Node.js发行版,电子5.0.0,以及任何将来的Node.js和Electron发行,这要归功于N-API。 leveldown的最小节点版本为10.12.0 。相反,对于节点> = 12,最小leveldown版本为5.0.0 。
leveldown NPM套件带有预先构建的二进制文件,用于流行的64位平台以及ARM,M1,Android和Alpine(Musl),并且众所周知:
安装leveldown时, node-gyp-build将检查是否存在兼容的二进制文件,并退回到编译步骤(如果不存在)。在这种情况下,您需要有效的node-gyp安装。
如果您不想在安装要安装的平台上使用预构建的二进制文件,请在安装时指定--build-from-source信号。之一:
npm install --build-from-source
npm install leveldown --build-from-source
如果您正在研究leveldown本身并想重新编译C ++代码,请运行npm run rebuild 。
leveldown > = 5。可以通过运行npm ls leveldown来检查这。leveldown为> = = 5.3.0或使用--build-from-source 。--build-from-source 。情况不再如此。nodejs-mobile fork制成和建造的。 如果您正在升级:请参阅UPGRADING.md 。
db = leveldown(location)返回一个新的leveldown实例。 location是指向要打开的LevelDB位置的字符串。
db.open([options, ]callback)打开商店。当数据库成功打开时,将在没有参数的情况下调用callback函数,或者如果出于任何原因,打开操作失败了,则会使用单个error参数。
options可选options参数可能包含:
createIfMissing (布尔值,默认值: true ):如果是true ,则如果不存在,将在指定位置初始化一个空数据库。如果false和数据库不存在,您将在open()回调中会收到错误,并且数据库将不会打开。
errorIfExists (布尔,默认值: false ):如果true在指定位置存在数据库,则将在open()回调中收到错误。
compression (布尔值,默认值: true ):如果为true ,则所有可压缩数据将通过存储前的快速压缩算法运行。 Snappy非常快,不应该通过禁用速度来获得太大的速度,因此除非有充分的理由将其关闭,否则请继续使用。
cacheSize (数字,默认值: 8 * 1024 * 1024 = 8MB):内存中LRU缓存的大小(以字节为单位),具有常用的未压缩块内容。
高级选项
以下选项用于高级性能调整。仅当您可以证明特定应用程序的实际收益时,才修改它们。
writeBufferSize (编号,默认值: 4 * 1024 * 1024 = 4MB):日志的最大大小(字节)(在内存中并存储在磁盘上的.log文件中)。除此大小外,LevelDB将将日志数据转换为排序的表文件的第一个级别。从LevelDB文档:较大的值会提高性能,尤其是在散装载荷期间。最多可以同时保存两个写缓冲区,因此您可能希望调整此参数以控制内存使用情况。同样,较大的写缓冲区将在下次打开数据库时会导致更长的恢复时间。
blockSize (数字,默认值4096 = 4K):组成表文件的块的大致大小。与未压缩数据有关的大小(因此“近似”)。块在表文件中索引,入门面涉及读取整个块并解析以发现所需的条目。
maxOpenFiles (数字,默认值: 1000 ):允许LevelDB一次打开的最大文件数量。如果您的数据存储可能有大型工作集,则可以增加此值以防止文件描述符流失。要计算工作集所需的文件数量,请将您的总数据除以'maxFileSize' 。
blockRestartInterval (编号,默认值: 16 ):在重新启动块内键的“ delta编码”之前,条目数。每个“重新启动”点都存储进入条目的完整键,在重新启动之间,省略了这些条目的键的常见前缀。重新启动与视频编码中的密钥帧的概念相似,可用于最大程度地减少存储密钥所需的空间量。在密钥中使用深刻的命名区 /前缀时,这特别有用。
maxFileSize (数字,默认值: 2* 1024 * 1024 = 2MB):切换到新的字节之前要写入文件的字节的最大值。从LevelDB文档:
...如果您的文件系统对较大的文件更有效,则可以考虑增加值。缺点将是较长的压缩,因此延长了延迟/性能打ic。增加此参数的另一个原因可能是当您最初填充大型数据库时。
db.close(callback) close()是现有数据库对象上的实例方法。基础级别DB数据库将关闭,如果操作成功或单个error参数,则在没有参数的情况下将调用callback函数,如果该操作出于任何原因失败。
leveldown等待任何待处理的操作在关闭之前完成。例如:
db . put ( 'key' , 'value' , function ( err ) {
// This happens first
} )
db . close ( function ( err ) {
// This happens second
} )db.put(key, value[, options], callback)存储新的条目或覆盖现有条目。
key和value对象可以是字符串或缓冲区。其他对象类型使用toString()方法将其转换为字符串。键可能不会为null或undefined ,并且用toString()转换对象不应导致空弦。值可能不会null或undefined 。 '' , []和Buffer.alloc(0)的值(其中一个导致toString() )的任何对象都将作为零长的字符阵列存储,因此将根据请求的类型而被检索为''或Buffer.alloc(0) 。
一组更丰富的数据类型可用于levelup 。
options options对象上当前唯一可用的属性是sync (布尔值,默认值: false ) 。如果您在options对象中提供了true的sync值,则LevelDB将执行数据的同步写入;尽管就节点而言,该操作将是异步的。通常,LevelDB将数据传递给操作系统以进行写作和返回,但是同步写入将使用fsync()或等效词,因此直到数据实际上在磁盘上,您的回调才会触发。同步文件系统的写入要比异步写入明显慢得多,但是如果您想绝对确定数据已刷新,则可以使用{ sync: true } 。
如果操作成功或单个error参数,则该callback函数将在没有参数的情况下被调用,如果该操作出于任何原因失败,则会拨打任何错误参数。
db.get(key[, options], callback)通过key从LevelDB商店获取值。
key对象可以是字符串或缓冲区,并且不能被undefined或null 。其他对象类型使用toString()方法将其转换为字符串,而所得的字符串可能不是零长度。一组更丰富的数据类型可用于levelup 。
通过get()获取的值存储为零长的字符阵列( null , undefined , '' , [] , Buffer.alloc(0) )将以空String ( '' )或buffer.alloc(alloc.aloc Buffer.alloc(0)返回时,请使用asBuffer: true (请参阅下面)。
options可选options对象可能包含:
asBuffer (布尔值,默认值: true ):用于确定是否将条目的value返回字符串或缓冲区的值。请注意,从缓冲区转换为字符串会产生成本,因此,如果您需要一个字符串(并且value可以合法成为UTF8字符串),则应用{ asBuffer: false }将其作为一个,并避免此转换成本。fillCache (布尔值,默认值: true ):LevelDB默认情况下将填充内存中的LRU CACHE中,并使用来自呼叫的数据中的数据。通过将fillCache设置为false来禁用此操作。如果操作因任何原因失败,包括未找到键,则会将callback函数带有单个error 。如果成功的第一个参数将为null ,第二个参数将是字符串或缓冲区的value ,具体取决于asBuffer选项。
db.getMany(keys[, options][, callback])通过一系列keys从商店中获取多个值。如get()中所述,可选的options对象可能包含asBuffer和fillCache 。
如果由于任何原因而失败,将带Error调用callback函数。如果成功的第一个参数将是null ,第二个参数将是与keys相同的顺序的值。如果找不到密钥,相关值将是undefined 。
如果没有提供回调,则退还承诺。
db.del(key[, options], callback)删除条目。 key对象可以是字符串或缓冲区,并且不能被undefined或null 。其他对象类型使用toString()方法将其转换为字符串,而所得的字符串可能不是零长度。一组更丰富的数据类型可用于levelup 。
options options对象上当前唯一可用的属性是sync (布尔值,默认值: false ) 。有关此选项的详细信息,请参见db.put() 。
如果操作成功或单个error参数,则该callback函数将在没有参数的情况下被调用,如果该操作出于任何原因失败,则会拨打任何错误参数。
db.batch(operations[, options], callback) (数组表单)批量执行多个PUT和/或DEL操作。 operations参数必须是一个Array ,其中包含要顺序执行的操作列表,尽管它们整体上是作为原子操作执行的。
每个操作都包含在具有以下属性的对象中: type , key , value ,其中type为'put'或'del' 。在'del'的情况下, value属性将被忽略。
key或value (在'put' ”的情况下为null或undefined任何条目都会导致callback中返回错误。具有'put'的type的任何条目,其value [] , ''或Buffer.alloc(0)的任何条目将被存储为零长的字符阵列,因此在读取过程中以''或Buffer.alloc(0)根据要求的方式获取。有关在实践中如何工作的完整文档,请参见levelup 。
可选options参数可能包含:
sync (布尔值,默认值: false )。有关此选项的详细信息,请参见db.put() 。如果批处理成功或出于任何原因Error ,则会在没有参数的情况下调用callback函数。
db.batch() (链式形式)返回一个新的chainedBatch实例。
db.approximateSize(start, end, callback) approximateSize()是现有数据库对象上的实例方法。用于获取范围[start..end)使用的文件系统空间的大约字节数。结果可能不包括最近的书面数据。
start和end参数可能是代表LevelDB存储中密钥的字符串或缓冲区。
如果由于任何原因,该操作失败,将带有单个error调用callback函数。如果成功的第一个参数将为null ,第二个参数将是一个数字的大约大小。
db.compactRange(start, end, callback) compactRange()是现有数据库对象上的实例方法。用于在[start..end)范围内手动触发数据库压实。
start和end参数可能是代表LevelDB存储中密钥的字符串或缓冲区。
如果操作成功或单个error参数,则该callback函数将在没有参数的情况下被调用,如果该操作出于任何原因失败,则会拨打任何错误参数。
db.getProperty(property) getProperty可用于从LevelDB获取内部详细信息。当发出有效属性字符串时,将返回一个可读的字符串(此方法是同步的)。
目前,唯一有效的属性是:
leveldb.num-files-at-levelN :返回N级的文件数,其中N是代表有效级别的整数(例如“ 0”)。
leveldb.stats :返回一个多行字符串,描述了有关LevelDB内部操作的统计信息。
leveldb.sstables :返回一个多行字符串,描述构成当前数据库内容的所有Sstables 。
db.iterator([options])返回一个新的iterator实例。接受以下范围选项:
gt (大于), gte (大于或相等)定义要迭代的范围的下限。只有钥匙大于(或等于)此选项的条目将包含在该范围内。当reverse=true时,订单将被颠倒,但是迭代的条目将相同。lt (小于), lte (小于或相等)定义要迭代的范围的较高界限。只有键小于(或等于)此选项的条目将包含在该范围内。当reverse=true时,订单将被颠倒,但是迭代的条目将相同。reverse (布尔值,默认值: false ) :以相反顺序进行迭代条目。当心,反向寻求比向前寻求慢。limit (数字,默认值: -1 ) :限制该迭代器收集的条目数。此数字代表最大数量的条目,如果您首先到达范围的末尾,则可能无法达到。值为-1意味着没有限制。当reverse=true时,将返回具有最高键的条目,而不是最低键。除范围选项外, iterator()还采用以下选项:
keys (布尔值,默认值: true ) :是否要返回每个条目的密钥。如果设置为false ,请致电iterator.next(callback)产生的键,值为undefined为1 。如果您最终不在乎钥匙是什么,则会有很小的效率提高,因为它们不需要转换并复制为JavaScript。values (布尔值,默认值: true ) :是否返回每个条目的值。如果设置为false ,请调用iterator.next(callback)的值将产生一个undefined 1的值。keyAsBuffer (布尔值,默认值: true ) :是否将每个条目的键返回为缓冲区或字符串。从缓冲区转换为字符串会产生成本,因此,如果您需要一个字符串(并且key可以合法成为UTF8字符串),则应将其作为一个。valueAsBuffer (布尔,默认值: true ) :是否将每个条目的值返回为缓冲区或字符串。fillCache (布尔值,默认值: false ):是否应填充LevelDB的LRU-CACHE。 1 leveldown返回一个空字符串,而不是目前undefined 。
db.clear([options, ]callback)删除所有条目或范围。不能保证是原子。接受以下范围选项(具有与迭代器相同的规则):
gt (大于), gte (大于或相等)定义要删除的范围的下限。只有钥匙大于(或等于)此选项的条目将包含在该范围内。当reverse=true时,订单将被逆转,但是删除的条目将相同。lt (小于), lte (小于或相等)定义要删除范围的较高界限。只有键小于(或等于)此选项的条目将包含在该范围内。当reverse=true时,订单将被逆转,但是删除的条目将相同。reverse (布尔值,默认值: false ) :以相反的顺序删除条目。仅有效与limit结合使用,以删除最后的N条目。limit (数字,默认值: -1 ) :限制要删除的条目数。此数字代表最大数量的条目,如果您首先到达范围的末尾,则可能无法达到。值为-1意味着没有限制。当reverse=true时,将删除具有最高键的条目,而不是最低键。如果没有提供选项,所有条目将被删除。如果操作成功或出于任何原因Error ,则会在没有参数的情况下调用callback函数。
chainedBatchchainedBatch.put(key, value)在此批处理上put操作。如果key或value无效,则遵循与db.batch()的数组形式相同的规则。
chainedBatch.del(key)在此批次上排队一个del操作。如果key无效,则可能会抛出。
chainedBatch.clear()清除此批次上的所有排队操作。
chainedBatch.write([options, ]callback)提交此批次的排队操作。所有操作都将在原子上写下,也就是说,他们将在没有任何局部提交的情况下成功或失败。
可选options参数可能包含:
sync (布尔值,默认值: false )。有关此选项的详细信息,请参见db.put() 。如果批处理成功或出于任何原因Error ,则会在没有参数的情况下调用callback函数。 write后,不允许进一步操作。
chainedBatch.db对创建此链式批次的db的引用。
iterator迭代器允许您迭代整个商店或范围。它在db.iterator()时创建的商店快照上运行。这意味着在迭代器上读取不受同时写入的影响。
可以连续调用for await...of或手动调用iterator.next()迭代器。在后一种模式下,必须始终调用iterator.end() 。相比之下, for await...of循环自动调用iterator.end() 。
在以下情况下,迭代器达到了自然的结局:
iterator.seek()超出了范围。迭代器跟踪何时进行next() ,并且何时调用end() ,因此它不允许并发next()呼叫,它确实允许end() ,并且在调用next() next()或end()之后不允许next()或end() 。
for await...of iterator收益包含key和value数组。 key和value的类型取决于传递给db.iterator()选项。
try {
for await ( const [ key , value ] of db . iterator ( ) ) {
console . log ( key )
}
} catch ( err ) {
console . error ( err )
} iterator.next([callback])推进迭代器并在该键处产生条目。如果发生错误,则将带Error调用callback函数。否则, callback会收到null ,一个key和value 。 key和value的类型取决于传递给db.iterator()选项。如果迭代器达到其自然端,则key和value都将undefined 。
如果没有提供回调,则如果迭代器达到自然端,则返回阵列(包含key和value )或undefined承诺。
注意:即使您收到错误,即使迭代器达到了自然的结尾,始终致电iterator.end() 。
iterator.seek(key)寻找迭代器到给定的键或最接近的键。随后对iterator.next()将产生等于或大于target的键或等于或小于target条目,如果将reverse选项传递给db.iterator()为true。同样for await...of它也适用于隐式iterator.next() 。
如果将gt等范围选项传递给db.iterator() ,而target不在该范围内,则迭代器将达到其自然端。
iterator.end([callback])结束迭代并释放潜在的资源。如果由于任何原因结束失败,就不会在没有关于成功的参数或Error情况下callback函数。
如果没有提供回调,则退还承诺。
iterator.db对创建此迭代器的db的引用。
leveldown.destroy(location, callback)完全删除现有的LevelDB数据库目录。如果要确保仅删除与LevelDB相关的文件,则可以使用此功能代替完整目录rm 。如果目录仅包含LevelDB文件,则目录本身也将被删除。如果目录中还有其他非级别文件,这些文件和目录将单独保留。
当销毁操作完成时,将调用回调,并带有可能的error参数。
leveldown.repair(location, callback)尝试修复损坏的LevelDB商店。从LevelDB文档:
如果无法打开数据库,您可以尝试调用此方法以使数据库的尽可能多的内容复活。某些数据可能会丢失,因此在包含重要信息的数据库上调用此功能时要小心。
您将在商店目录内的日志文件中找到有关维修操作的信息。
repair()也可以用于执行LevelDB日志的压实到表文件中。
修复操作完成时,将调用回调,并带有可能的error参数。
当前leveldown不会跟踪基础级别DB实例的状态。这意味着在已经打开的数据库上调用open()可能会导致错误。同样,在非打开数据库上调用任何其他操作可能会导致错误。
levelup当前跟踪和管理状态,并将防止州外操作发送到leveldown 。如果您直接使用leveldown ,则必须自己跟踪和管理状态。
leveldown公开了LevelDB的功能,称为快照。这意味着,当您同时执行createReadStream和createWriteStream时,Write流修改的任何数据都不会影响从读取流发出的数据。换句话说,levelDB快照在创建快照时捕获了最新状态,从而使快照可以迭代或读取数据,而无需看到任何后续写入。任何未在快照上执行的读取都将隐式使用最新状态。
如果您有问题,欢迎您在GitHub存储库上打开问题。
过去和不再有效的支持渠道包括FreeNode和Node.js LevelDB Google组上的##leveldb IRC频道。
Level/leveldown是一个开放的开源项目。这意味着:
做出巨大贡献的个人可以使该项目获得合适的贡献。该项目更像是一个开放的Wiki,而不是标准的护卫开源项目。
有关更多详细信息,请参见贡献指南。
该项目使用git子模型。这意味着,如果您打算进行工作,则应递归克隆它:
$ git clone --recurse-submodules https://github.com/Level/leveldown.git另外,您可以初始化克隆文件夹中的子模块:
$ git submodule update --init --recursivenpm version ..git push --follow-tags./prebuilds npm run download-prebuildsnpm run test-prebuildcanadian-pubnpm publish 通过每月的公开集体捐款来支持我们,并帮助我们继续工作。
麻省理工学院
leveldown基于Google的LevelDB和Snappy团队的出色工作以及其他贡献者。 LevelDB和Snappy均根据新的BSD许可发行。 leveldown Windows支持的很大一部分来自Krzysztof Kowalczyk( @kjk )的Windows LevelDB端口(已存档)。如果您在Windows上使用leveldown ,则应感谢他的感谢!