被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 ,則應感謝他的感謝!