? Dieses Modul wird bald veraltet sein, da es durch
abstract-level
ersetzt wird.
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])
(Array-Form)db.batch()
(verkettete Form)db.status
db.isOperational()
db.createReadStream([options])
db.createKeyStream([options])
db.createValueStream([options])
db.iterator([options])
db.clear([options][, callback])
db.createWriteStream
passiert? Schnelle und einfache Lagerung. Ein Node.js-Wrapper für abstract-leveldown
kompatible Stores, die den Merkmalen von LevelDB folgen.
LevelDB ist ein einfacher Schlüsselwertspeicher, der von Google entwickelt wurde. Es wird in Google Chrome und vielen anderen Produkten verwendet. LevelDB unterstützt beliebige Byte-Arrays sowohl als Schlüssel als auch als Werte, singuläre Get- , Put- und Löschoperationen , Batch-Put- und Löschvorgänge , bidirektionale Iteratoren und einfache Komprimierung mit dem sehr schnellen Snappy-Algorithmus.
LevelDB speichert Einträge lexikografisch nach Schlüsseln sortiert. Dies macht die Streaming-Schnittstelle von levelup
– die LevelDB-Iteratoren als lesbare Streams verfügbar macht – zu einem sehr leistungsstarken Abfragemechanismus.
Der gebräuchlichste Speicher ist leveldown
, der eine reine C++-Bindung an LevelDB bereitstellt. Es stehen viele alternative Stores zur Verfügung, beispielsweise level.js
im Browser oder memdown
für einen In-Memory-Store. Sie unterstützen normalerweise Zeichenfolgen und Puffer sowohl für Schlüssel als auch für Werte. Für einen umfangreicheren Satz an Datentypen können Sie den Speicher mit encoding-down
umschließen.
Das level
-Paket ist der empfohlene Einstieg. Es bündelt bequem levelup
, leveldown
und encoding-down
. Sein Hauptexport ist levelup
– das heißt, Sie können var db = require('level')
ausführen.
Unser Ziel ist es, aktive LTS- und aktuelle Node.js-Versionen sowie Browser zu unterstützen. Informationen zur Unterstützung des zugrunde liegenden Stores finden Sie in der entsprechenden Dokumentation.
Wenn Sie ein Upgrade durchführen: Bitte sehen Sie sich UPGRADING.md
an.
Zuerst müssen Sie levelup
installieren! Da keine Stores enthalten sind, müssen Sie beispielsweise auch leveldown
installieren.
$ npm install levelup leveldown
Alle Vorgänge sind asynchron. Wenn Sie keinen Rückruf bereitstellen, wird ein Promise zurückgegeben.
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]])
Der Haupteinstiegspunkt zum Erstellen einer neuen levelup
Instanz.
db
muss ein abstract-leveldown
kompatibler Speicher sein.options
werden beim Öffnen an das zugrunde liegende Geschäft weitergegeben und sind spezifisch für die Art des verwendeten Geschäfts Durch den Aufruf von levelup(db)
wird auch der zugrunde liegende Store geöffnet. Dies ist ein asynchroner Vorgang, der Ihren Rückruf auslöst, wenn Sie einen angeben. Der Rückruf sollte die Form function (err, db) {}
annehmen, wobei db
die levelup
Instanz ist. Wenn Sie keinen Rückruf bereitstellen, werden alle Lese- und Schreibvorgänge einfach intern in die Warteschlange gestellt, bis der Speicher vollständig geöffnet ist, es sei denn, das Öffnen schlägt fehl. In diesem Fall wird ein error
ausgegeben.
Dies führt zu zwei alternativen Möglichkeiten zur Verwaltung einer levelup
Instanz:
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 )
} )
} )
Im Vergleich zum Äquivalent:
// 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
Ein schreibgeschütztes Manifest. Könnte so verwendet werden:
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])
Öffnet den zugrunde liegenden Store. Im Allgemeinen sollten Sie diese Methode nicht direkt aufrufen müssen, da sie automatisch von levelup()
aufgerufen wird. Es ist jedoch möglich, den Store wieder zu öffnen, nachdem er mit close()
geschlossen wurde.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.close([callback])
close()
schließt den zugrunde liegenden Speicher. Der Rückruf erhält als erstes Argument jeden Fehler, der beim Schließen auftritt.
Sie sollten Ihre levelup
-Instanz immer bereinigen, indem Sie close()
aufrufen, wenn Sie sie nicht mehr benötigen, um Ressourcen freizugeben. Ein Shop kann nicht von mehreren levelup
-Instanzen gleichzeitig geöffnet werden.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.put(key, value[, options][, callback])
put()
ist die primäre Methode zum Einfügen von Daten in den Speicher. Sowohl key
als auch value
können hinsichtlich levelup
von beliebigem Typ sein.
options
werden an den zugrunde liegenden Store weitergegeben.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.get(key[, options][, callback])
Rufen Sie mit key
einen Wert aus dem Speicher ab. Der key
kann beliebiger Art sein. Wenn es im Store nicht vorhanden ist, erhält der Rückruf oder das Versprechen eine Fehlermeldung. Ein nicht gefundenes Fehlerobjekt hat den Typ 'NotFoundError'
sodass Sie err.type == 'NotFoundError'
verwenden oder einen Wahrheitstest für die Eigenschaft err.notFound
durchführen können.
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
} )
Das optionale options
wird an den zugrunde liegenden Speicher weitergegeben.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.getMany(keys[, options][, callback])
Rufen Sie über ein keys
mehrere Werte aus dem Speicher ab. Das optionale options
wird an den zugrunde liegenden Speicher weitergegeben.
Die callback
wird mit einem Error
aufgerufen, wenn der Vorgang aus irgendeinem Grund fehlgeschlagen ist. Bei Erfolg ist das erste Argument null
und das zweite Argument ein Array von Werten mit der gleichen Reihenfolge wie keys
. Wenn ein Schlüssel nicht gefunden wurde, ist der entsprechende Wert undefined
.
Wenn kein Rückruf bereitgestellt wird, wird ein Versprechen zurückgegeben.
db.del(key[, options][, callback])
del()
ist die primäre Methode zum Entfernen von Daten aus dem Speicher.
db . del ( 'foo' , function ( err ) {
if ( err )
// handle I/O or other error
} ) ;
options
werden an den zugrunde liegenden Store weitergegeben.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.batch(array[, options][, callback])
(Array-Form) batch()
kann für sehr schnelle Massenschreibvorgänge (sowohl put als auch delete ) verwendet werden. Das array
-Argument sollte eine Liste von Operationen enthalten, die nacheinander ausgeführt werden sollen, obwohl sie insgesamt als atomare Operation innerhalb des zugrunde liegenden Speichers ausgeführt werden.
Jede Operation ist in einem Objekt mit den folgenden Eigenschaften enthalten: type
, key
, value
, wobei der Typ entweder 'put'
oder 'del'
ist. Im Fall von 'del'
wird die value
Eigenschaft ignoriert. Alle Einträge mit dem key
„ null
“ oder undefined
führen dazu, dass beim callback
ein Fehler zurückgegeben wird, und jeder Eintrag vom type: 'put'
mit dem value
„ null
oder undefined
gibt einen Fehler zurück.
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
werden an den zugrunde liegenden Store weitergegeben.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.batch()
(verkettete Form) Wenn batch()
ohne Argumente aufgerufen wird, wird ein Batch
-Objekt zurückgegeben, mit dem eine atomare Batch-Operation erstellt und schließlich festgeschrieben werden kann. Je nachdem, wie es verwendet wird, ist es möglich, eine höhere Leistung zu erzielen, wenn die verkettete Form von batch()
gegenüber der Array-Form verwendet wird.
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])
Stellt einen Put -Vorgang für den aktuellen Stapel in die Warteschlange und wird erst festgeschrieben, wenn ein write()
für den Stapel aufgerufen wird. Das options
muss, sofern angegeben, ein Objekt sein und wird an den zugrunde liegenden Speicher weitergegeben.
Diese Methode kann einen WriteError
throw
, wenn bei Ihrem Put ein Problem vorliegt (z. B. wenn der value
null
oder undefined
ist).
batch.del(key[, options])
Stellt einen Del -Vorgang für den aktuellen Stapel in die Warteschlange und wird erst festgeschrieben, wenn ein write()
für den Stapel aufgerufen wird. Das options
muss, sofern angegeben, ein Objekt sein und wird an den zugrunde liegenden Speicher weitergegeben.
Diese Methode kann einen WriteError
throw
, wenn beim Löschen ein Problem auftritt.
batch.clear()
Löschen Sie alle Vorgänge in der Warteschlange für den aktuellen Stapel. Alle vorherigen Vorgänge werden verworfen.
batch.length
Die Anzahl der Vorgänge in der Warteschlange für den aktuellen Stapel.
batch.write([options][, callback])
Übernehmen Sie die Vorgänge in der Warteschlange für diesen Stapel. Alle nicht gelöschten Vorgänge werden atomar in den zugrunde liegenden Speicher geschrieben, d. h. sie sind entweder alle erfolgreich oder schlagen fehl, ohne dass teilweise Festschreibungen erfolgen.
Das optionale options
wird an die .write()
-Operation des zugrunde liegenden Batch-Objekts übergeben.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.status
Eine schreibgeschützte Zeichenfolge, die eine der folgenden ist:
new
– neu erstellt, nicht geöffnet oder geschlossenopening
– Warten auf die Eröffnung des zugrunde liegenden Geschäftsopen
– der Store wurde erfolgreich geöffnet und steht zur Nutzung zur Verfügungclosing
– Warten auf die Schließung des Ladensclosed
– der Laden wurde erfolgreich geschlossen.db.isOperational()
Gibt true
zurück, wenn der Store Vorgänge akzeptiert, was im Fall von levelup
bedeutet, dass status
entweder opening
oder open
lautet, da er sich selbst öffnet und Vorgänge in die Warteschlange stellt, bis er geöffnet wird.
db.createReadStream([options])
Gibt einen lesbaren Stream von Schlüssel-Wert-Paaren zurück. Ein Paar ist ein Objekt mit key
und value
. Standardmäßig werden alle Einträge im zugrunde liegenden Speicher von Anfang bis Ende gestreamt. Verwenden Sie die unten beschriebenen Optionen, um den Bereich, die Richtung und die Ergebnisse zu steuern.
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' )
} )
Sie können ein Optionsobjekt als ersten Parameter für createReadStream()
mit den folgenden Eigenschaften angeben:
gt
(größer als), gte
(größer als oder gleich) definieren die untere Grenze des zu streamenden Bereichs. Nur Einträge, bei denen der Schlüssel größer (oder gleich) dieser Option ist, werden in den Bereich aufgenommen. Bei reverse=true
wird die Reihenfolge umgekehrt, aber die gestreamten Einträge sind dieselben.
lt
(kleiner als), lte
(kleiner als oder gleich) definieren die Obergrenze des zu streamenden Bereichs. Nur Einträge, bei denen der Schlüssel kleiner (oder gleich) dieser Option ist, werden in den Bereich aufgenommen. Bei reverse=true
wird die Reihenfolge umgekehrt, aber die gestreamten Einträge sind dieselben.
reverse
(boolean, Standard: false
) : Einträge in umgekehrter Reihenfolge streamen. Beachten Sie, dass eine Rückwärtssuche aufgrund der Funktionsweise von Speichern wie LevelDB langsamer sein kann als eine Vorwärtssuche.
limit
(Anzahl, Standard: -1
) : Begrenzen Sie die Anzahl der von diesem Stream gesammelten Einträge. Diese Zahl stellt eine maximale Anzahl von Einträgen dar und wird möglicherweise nicht erreicht, wenn Sie zuerst das Ende des Bereichs erreichen. Ein Wert von -1
bedeutet, dass es keine Begrenzung gibt. Bei reverse=true
werden die Einträge mit den höchsten Schlüsseln anstelle der niedrigsten Schlüssel zurückgegeben.
keys
(boolean, Standard: true
) : ob die Ergebnisse Schlüssel enthalten sollen. Wenn der Wert auf true
und values
auf false
festgelegt sind, handelt es sich bei den Ergebnissen lediglich um Schlüssel und nicht um Objekte mit einer key
. Wird intern von der Methode createKeyStream()
verwendet.
values
(boolean, Standard: true
) : ob die Ergebnisse Werte enthalten sollen. Wenn es auf true
und keys
auf false
gesetzt ist, handelt es sich bei den Ergebnissen lediglich um Werte und nicht um Objekte mit einer value
. Wird intern von der Methode createValueStream()
verwendet.
db.createKeyStream([options])
Gibt einen lesbaren Stream von Schlüsseln anstelle von Schlüssel-Wert-Paaren zurück. Verwenden Sie dieselben Optionen wie für createReadStream()
beschrieben, um den Bereich und die Richtung zu steuern.
Sie können diesen Stream auch erhalten, indem Sie ein Optionsobjekt an createReadStream()
übergeben, wobei keys
auf true
und values
auf false
gesetzt sind. Das Ergebnis ist gleichwertig; Beide Streams arbeiten im Objektmodus.
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])
Gibt einen lesbaren Stream von Werten anstelle von Schlüssel-Wert-Paaren zurück. Verwenden Sie dieselben Optionen wie für createReadStream()
beschrieben, um den Bereich und die Richtung zu steuern.
Sie können diesen Stream auch erhalten, indem Sie ein Optionsobjekt an createReadStream()
übergeben, dessen values
auf true
und keys
auf false
gesetzt sind. Das Ergebnis ist gleichwertig; Beide Streams arbeiten im Objektmodus.
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])
Gibt einen abstract-leveldown
Iterator zurück, der die oben genannten lesbaren Streams antreibt. Die Optionen sind mit den Bereichsoptionen von createReadStream()
identisch und werden an den zugrunde liegenden Speicher übergeben.
Diese Iteratoren unterstützen for await...of
“:
for await ( const [ key , value ] of db . iterator ( ) ) {
console . log ( value )
}
db.clear([options][, callback])
Alle Einträge oder einen Bereich löschen. Es ist nicht garantiert, dass es atomar ist. Akzeptiert die folgenden Bereichsoptionen (mit denselben Regeln wie bei Iteratoren):
gt
(größer als), gte
(größer als oder gleich) definieren die untere Grenze des zu löschenden Bereichs. Nur Einträge, bei denen der Schlüssel größer (oder gleich) dieser Option ist, werden in den Bereich aufgenommen. Bei reverse=true
wird die Reihenfolge umgekehrt, aber die gelöschten Einträge bleiben dieselben.lt
(kleiner als), lte
(kleiner als oder gleich) definieren die Obergrenze des zu löschenden Bereichs. Nur Einträge, bei denen der Schlüssel kleiner (oder gleich) dieser Option ist, werden in den Bereich aufgenommen. Bei reverse=true
wird die Reihenfolge umgekehrt, aber die gelöschten Einträge bleiben dieselben.reverse
(boolean, Standard: false
) : Einträge in umgekehrter Reihenfolge löschen. Nur wirksam in Kombination mit limit
, um die letzten N Datensätze zu entfernen.limit
(Anzahl, Standard: -1
) : Begrenzen Sie die Anzahl der zu löschenden Einträge. Diese Zahl stellt eine maximale Anzahl von Einträgen dar und wird möglicherweise nicht erreicht, wenn Sie zuerst das Ende des Bereichs erreichen. Ein Wert von -1
bedeutet, dass es keine Begrenzung gibt. Bei reverse=true
werden die Einträge mit den höchsten Schlüsseln anstelle der niedrigsten Schlüssel gelöscht. Wenn keine Optionen bereitgestellt werden, werden alle Einträge gelöscht. Die callback
wird ohne Argumente aufgerufen, wenn der Vorgang erfolgreich war, oder mit einem WriteError
wenn er aus irgendeinem Grund fehlgeschlagen ist.
Wenn kein Rückruf übergeben wird, wird ein Versprechen zurückgegeben.
db.createWriteStream
passiert? db.createWriteStream()
wurde entfernt, um einen kleineren und besser wartbaren Kern bereitzustellen. Es diente in erster Linie dazu, mit db.createReadStream()
Symmetrie zu erzeugen, aber nach vielen Diskussionen war es die beste Vorgehensweise, es zu entfernen.
Der Haupttreiber hierfür war die Leistung. Während db.createReadStream()
in den meisten Anwendungsfällen eine gute Leistung erbringt, war db.createWriteStream()
stark von den Anwendungsschlüsseln und -werten abhängig. Daher können wir keine Standardimplementierung bereitstellen und die Erstellung weiterer write-stream
-Implementierungen fördern, um das breite Spektrum an Anwendungsfällen zu lösen.
Schauen Sie sich hier die Implementierungen an, die die Community erstellt hat.
Jede Funktion, die einen Rückruf akzeptiert, gibt ein Versprechen zurück, wenn der Rückruf weggelassen wird. Die einzige Ausnahme ist der levelup
Konstruktor selbst, der, wenn kein Rückruf übergeben wird, den zugrunde liegenden Speicher langsam im Hintergrund öffnet.
Beispiel:
const db = levelup ( leveldown ( './my-db' ) )
await db . put ( 'foo' , 'bar' )
console . log ( await db . get ( 'foo' ) )
levelup
ist ein EventEmitter
und gibt die folgenden Ereignisse aus.
Ereignis | Beschreibung | Argumente |
---|---|---|
put | Schlüssel wurde aktualisiert | key, value (beliebig) |
del | Schlüssel wurde gelöscht | key (beliebig) |
batch | Batch wurde ausgeführt | operations (Array) |
clear | Einträge wurden gelöscht | options (Objekt) |
opening | Der zugrunde liegende Laden wird eröffnet | - |
open | Der Laden hat eröffnet | - |
ready | Alias von open | - |
closing | Der Laden schließt | - |
closed | Der Laden hat geschlossen. | - |
error | Es ist ein Fehler aufgetreten | error (Fehler) |
Sie können zum Beispiel Folgendes tun:
db . on ( 'put' , function ( key , value ) {
console . log ( 'inserted' , { key , value } )
} )
Stores wie LevelDB sind threadsicher, eignen sich jedoch nicht für den Zugriff mit mehreren Prozessen. Ein Store sollte immer nur über einen einzigen Node.js-Prozess geöffnet sein. Node.js-Cluster bestehen aus mehreren Prozessen, sodass eine levelup
Instanz auch nicht zwischen ihnen geteilt werden kann.
Unter Level/awesome
finden Sie Module wie multileveldown
, die hilfreich sein können, wenn Sie die gemeinsame Nutzung eines einzelnen Stores durch mehrere Prozesse benötigen.
Level/levelup
ist ein OFFENES Open-Source-Projekt . Das bedeutet:
Einzelpersonen, die bedeutende und wertvolle Beiträge leisten, erhalten Commit-Zugriff auf das Projekt, um nach eigenem Ermessen Beiträge zu leisten. Dieses Projekt ähnelt eher einem offenen Wiki als einem standardmäßig geschützten Open-Source-Projekt.
Weitere Einzelheiten finden Sie im Beitragsleitfaden.
Browserübergreifende Testplattform und Open Source ♥ Bereitgestellt von Sauce Labs.
Unterstützen Sie uns mit einer monatlichen Spende auf Open Collective und helfen Sie uns, unsere Arbeit fortzusetzen.
MIT