?このモジュールは、
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
はどうなったのでしょうか?高速かつシンプルなストレージ。 LevelDB の特性に従っている、 abstract-leveldown
準拠ストアの Node.js ラッパー。
LevelDB は、Google によって構築されたシンプルなキーと値のストアです。 Google Chrome や他の多くの製品で使用されています。 LevelDB は、キーと値の両方として任意のバイト配列、単一のget 、 putおよびdelete操作、バッチされた put および delete 、双方向イテレータ、および非常に高速な Snappy アルゴリズムを使用した単純な圧縮をサポートします。
LevelDB は、キーによって辞書順にソートされたエントリを保存します。これにより、LevelDB イテレータを Readable Streams として公開するlevelup
のストリーミング インターフェイスが非常に強力なクエリ メカニズムになります。
最も一般的なストアは、LevelDB への純粋な C++ バインディングを提供するleveldown
です。ブラウザーの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 db
levelup
インスタンスです。コールバックを提供しない場合、読み取りおよび書き込み操作は、ストアが完全に開くまで内部でキューに入れられます。ただし、オープンに失敗した場合はerror
イベントが発行されます。
これにより、 levelup
インスタンスを管理する 2 つの代替方法が得られます。
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()
を使用してストアを閉じた後、再度ストアを開くことは可能です。
コールバックが渡されない場合は、Promise が返されます。
db.close([callback])
close()
基礎となるストアを閉じます。コールバックは、クローズ中に発生したエラーを最初の引数として受け取ります。
リソースを解放する必要がなくなった場合は、常にclose()
を呼び出してlevelup
インスタンスをクリーンアップする必要があります。 levelup
の複数のインスタンスによって同時にストアを開くことはできません。
コールバックが渡されない場合は、Promise が返されます。
db.put(key, value[, options][, callback])
put()
ストアにデータを挿入するための主なメソッドです。 levelup
に関する限り、 key
とvalue
どちらも任意のタイプにすることができます。
options
基になるストアに渡されます。
コールバックが渡されない場合は、Promise が返されます。
db.get(key[, options][, callback])
key
によってストアから値を取得します。 key
任意のタイプにすることができます。ストアに存在しない場合、コールバックまたはプロミスはエラーを受け取ります。見つからない 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
オブジェクトは、基になるストアに渡されます。
コールバックが渡されない場合は、Promise が返されます。
db.getMany(keys[, options][, callback])
keys
の配列によってストアから複数の値を取得します。オプションのoptions
オブジェクトは、基になるストアに渡されます。
何らかの理由で操作が失敗した場合、 callback
関数はError
で呼び出されます。成功した場合、最初の引数はnull
になり、2 番目の引数はkeys
と同じ順序の値の配列になります。キーが見つからなかった場合、関連する値はundefined
になります。
コールバックが提供されない場合は、Promise が返されます。
db.del(key[, options][, callback])
del()
ストアからデータを削除するための主なメソッドです。
db . del ( 'foo' , function ( err ) {
if ( err )
// handle I/O or other error
} ) ;
options
基になるストアに渡されます。
コールバックが渡されない場合は、Promise が返されます。
db.batch(array[, options][, callback])
(配列形式) batch()
非常に高速な一括書き込み操作 ( putとdelete の両方) に使用できます。 array
引数には、順番に実行される操作のリストが含まれている必要がありますが、全体としては、基礎となるストア内でアトミックな操作として実行されます。
各操作は、 type
、 key
、 value
プロパティを持つオブジェクトに含まれます。ここで、 type は'put'
または'del'
のいずれかです。 'del'
の場合、 value
プロパティは無視されます。 null
またはundefined
のkey
を持つエントリは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
基になるストアに渡されます。
コールバックが渡されない場合は、Promise が返されます。
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
であるなど)、このメソッドはWriteError
throw
ことがあります。
batch.del(key[, options])
現在のバッチのdel操作をキューに入れます。バッチでwrite()
が呼び出されるまでコミットされません。 options
引数を指定する場合は、オブジェクトである必要があり、基礎となるストアに渡されます。
削除に問題がある場合、このメソッドはWriteError
throw
可能性があります。
batch.clear()
現在のバッチのキューにある操作をすべてクリアします。以前の操作はすべて破棄されます。
batch.length
現在のバッチでキューに入れられた操作の数。
batch.write([options][, callback])
このバッチのキューに入れられた操作をコミットします。クリアされなかったすべての操作は、基になるストアにアトミックに書き込まれます。つまり、それらはすべて成功するか、部分的なコミットなしで失敗します。
オプションのoptions
オブジェクトは、基礎となるバッチ オブジェクトの.write()
オペレーションに渡されます。
コールバックが渡されない場合は、Promise が返されます。
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、デフォルト: false
) : エントリを逆の順序でストリームします。 LevelDB などのストアの動作方法により、逆方向シークは順方向シークよりも遅くなる可能性があることに注意してください。
limit
(number、デフォルト: -1
) : このストリームによって収集されるエントリの数を制限します。この数値はエントリの最大数を表しており、最初に範囲の終わりに達すると、この数値に到達しない可能性があります。値-1
は制限がないことを意味します。 reverse=true
の場合、最も低いキーの代わりに最も高いキーを持つエントリが返されます。
keys
(ブール値、デフォルト: true
) : 結果にキーを含めるかどうか。 true
に設定され、 values
false
に設定された場合、結果はkey
プロパティを持つオブジェクトではなく、単にキーになります。 createKeyStream()
メソッドによって内部的に使用されます。
values
(ブール値、デフォルト: true
) : 結果に値を含めるかどうか。 true
に設定され、 keys
false
に設定されている場合、結果はvalue
プロパティを持つオブジェクトではなく、単に値になります。 createValueStream()
メソッドによって内部的に使用されます。
db.createKeyStream([options])
キーと値のペアではなく、キーの読み取り可能なストリームを返します。 createReadStream()
で説明したのと同じオプションを使用して、範囲と方向を制御します。
また、 keys
をtrue
に設定し、 values
false
に設定してオプション オブジェクトをcreateReadStream()
に渡すことによって、このストリームを取得することもできます。結果は同等です。どちらのストリームもオブジェクト モードで動作します。
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()
で説明したのと同じオプションを使用して、範囲と方向を制御します。
values
true
に設定し、 keys
false
に設定してオプション オブジェクトをcreateReadStream()
に渡すことによって、このストリームを取得することもできます。結果は同等です。どちらのストリームもオブジェクト モードで動作します。
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
(ブール値、デフォルト: false
) : 逆の順序でエントリを削除します。最後の N レコードを削除するには、 limit
と組み合わせた場合にのみ有効です。limit
(number、デフォルト: -1
) : 削除するエントリの数を制限します。この数値はエントリの最大数を表しており、最初に範囲の終わりに達すると、この数値に到達しない可能性があります。値-1
は制限がないことを意味します。 reverse=true
の場合、最も低いキーの代わりに最も高いキーを持つエントリが削除されます。オプションを指定しない場合、すべてのエントリが削除されます。 callback
関数は、操作が成功した場合は引数なしで呼び出され、操作が何らかの理由で失敗した場合はWriteError
を使用して呼び出されます。
コールバックが渡されない場合は、Promise が返されます。
db.createWriteStream
はどうなったのでしょうか? db.createWriteStream()
、より小型で保守しやすいコアを提供するために削除されました。これは主にdb.createReadStream()
との対称性を作成するために存在していましたが、多くの議論を経て、これを削除することが最善の策でした。
これを推進した主な要因はパフォーマンスでした。 db.createReadStream()
ほとんどのユースケースで適切に動作しますが、 db.createWriteStream()
アプリケーションのキーと値に大きく依存していました。したがって、標準実装を提供することはできず、幅広いユースケースを解決するために、より多くのwrite-stream
実装を作成することを奨励することはできません。
コミュニティが作成した実装をここで確認してください。
コールバックを受け入れる各関数は、コールバックが省略された場合に Promise を返します。唯一の例外は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
インスタンスをプロセス間で共有することもできません。
単一のストアをプロセス間で共有する必要がある場合に役立つmultileveldown
などのモジュールについてはLevel/awesome
を参照してください。
Level/levelup
OPEN オープンソース プロジェクトです。これは次のことを意味します。
重要かつ貴重な貢献をした個人には、プロジェクトへのコミット アクセスが与えられ、必要に応じて貢献できます。このプロジェクトは、標準的な保護されたオープンソース プロジェクトというよりは、オープン Wiki に似ています。
詳細については、貢献ガイドを参照してください。
クロスブラウザー テスト プラットフォームとオープンソース ♥ Sauce Labs によって提供されます。
Open Collective での毎月の寄付で私たちをサポートし、私たちの活動を継続するのにご協力ください。
マサチューセッツ工科大学