? Modul ini akan segera ditinggalkan karena digantikan oleh
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])
(bentuk array)db.batch()
(bentuk berantai)db.status
db.isOperational()
db.createReadStream([options])
db.createKeyStream([options])
db.createValueStream([options])
db.iterator([options])
db.clear([options][, callback])
db.createWriteStream
? Penyimpanan cepat dan sederhana. Pembungkus Node.js untuk penyimpanan yang sesuai abstract-leveldown
, yang mengikuti karakteristik LevelDB.
LevelDB adalah penyimpanan nilai kunci sederhana yang dibuat oleh Google. Ini digunakan di Google Chrome dan banyak produk lainnya. LevelDB mendukung array byte arbitrer sebagai kunci dan nilai, operasi get tunggal, put dan delete , batch put dan delete , iterator dua arah dan kompresi sederhana menggunakan algoritma Snappy yang sangat cepat.
LevelDB menyimpan entri yang diurutkan secara leksikografis berdasarkan kunci. Hal ini membuat antarmuka streaming levelup
- yang menampilkan iterator LevelDB sebagai Aliran yang Dapat Dibaca - menjadi mekanisme kueri yang sangat kuat.
Penyimpanan yang paling umum adalah leveldown
yang menyediakan pengikatan C++ murni ke LevelDB. Banyak penyimpanan alternatif yang tersedia seperti level.js
di browser atau memdown
untuk penyimpanan dalam memori. Mereka biasanya mendukung string dan Buffer untuk kunci dan nilai. Untuk kumpulan tipe data yang lebih kaya, Anda dapat menggabungkan penyimpanan dengan encoding-down
.
Paket level
adalah cara yang disarankan untuk memulai. Ini dengan mudah menggabungkan levelup
, leveldown
dan encoding-down
. Ekspor utamanya adalah levelup
- yaitu Anda dapat melakukan var db = require('level')
.
Kami bertujuan untuk mendukung rilis LTS Aktif dan Node.js saat ini serta browser. Untuk dukungan toko yang mendasarinya, silakan lihat dokumentasi masing-masing.
Jika Anda melakukan upgrade: silakan lihat UPGRADING.md
.
Pertama, Anda perlu menginstal levelup
! Tidak ada toko yang disertakan sehingga Anda juga harus menginstal leveldown
(misalnya).
$ npm install levelup leveldown
Semua operasi tidak sinkron. Jika Anda tidak memberikan panggilan balik, Janji dikembalikan.
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]])
Titik masuk utama untuk membuat instance levelup
baru.
db
harus merupakan penyimpanan yang sesuai abstract-leveldown
.options
diteruskan ke penyimpanan yang mendasarinya ketika dibuka dan khusus untuk jenis penyimpanan yang digunakan Memanggil levelup(db)
juga akan membuka penyimpanan yang mendasarinya. Ini adalah operasi asinkron yang akan memicu panggilan balik jika Anda menyediakannya. Callback harus berbentuk function (err, db) {}
dengan db
sebagai instance levelup
. Jika Anda tidak memberikan panggilan balik, operasi baca & tulis apa pun hanya akan diantrekan secara internal hingga penyimpanan dibuka sepenuhnya, kecuali jika gagal dibuka, dalam hal ini peristiwa error
akan terjadi.
Hal ini mengarah pada dua cara alternatif dalam mengelola instance 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 )
} )
} )
Dibandingkan dengan yang setara:
// 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
Manifes hanya-baca. Mungkin digunakan seperti ini:
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])
Membuka toko yang mendasarinya. Secara umum Anda tidak perlu memanggil metode ini secara langsung karena metode ini dipanggil secara otomatis oleh levelup()
. Namun, toko dapat dibuka kembali setelah ditutup dengan close()
.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.close([callback])
close()
menutup penyimpanan yang mendasarinya. Callback akan menerima kesalahan apa pun yang ditemui selama penutupan sebagai argumen pertama.
Anda harus selalu membersihkan instance levelup
Anda dengan memanggil close()
ketika Anda tidak lagi memerlukannya untuk mengosongkan sumber daya. Sebuah toko tidak dapat dibuka dengan beberapa kali levelup
secara bersamaan.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.put(key, value[, options][, callback])
put()
adalah metode utama untuk memasukkan data ke dalam penyimpanan. Baik key
maupun value
dapat berupa jenis apa pun sejauh menyangkut levelup
.
options
diteruskan ke penyimpanan yang mendasarinya.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.get(key[, options][, callback])
Dapatkan nilai dari toko dengan key
. key
bisa jenis apa saja. Jika tidak ada di toko maka panggilan balik atau janji akan menerima kesalahan. Objek err yang tidak ditemukan akan bertipe 'NotFoundError'
sehingga Anda dapat err.type == 'NotFoundError'
atau Anda dapat melakukan pengujian kebenaran pada properti 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
} )
Objek options
opsional diteruskan ke penyimpanan yang mendasarinya.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.getMany(keys[, options][, callback])
Dapatkan banyak nilai dari penyimpanan dengan serangkaian keys
. Objek options
opsional diteruskan ke penyimpanan yang mendasarinya.
Fungsi callback
akan dipanggil dengan Error
jika operasi gagal karena alasan apa pun. Jika berhasil, argumen pertama akan bernilai null
dan argumen kedua akan berupa array nilai dengan urutan yang sama dengan keys
. Jika kunci tidak ditemukan, nilai yang relevan akan menjadi undefined
.
Jika tidak ada panggilan balik yang diberikan, janji dikembalikan.
db.del(key[, options][, callback])
del()
adalah metode utama untuk menghapus data dari penyimpanan.
db . del ( 'foo' , function ( err ) {
if ( err )
// handle I/O or other error
} ) ;
options
diteruskan ke penyimpanan yang mendasarinya.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.batch(array[, options][, callback])
(bentuk array) batch()
dapat digunakan untuk operasi penulisan massal yang sangat cepat ( put dan delete ). Argumen array
harus berisi daftar operasi yang akan dieksekusi secara berurutan, meskipun secara keseluruhan operasi tersebut dilakukan sebagai operasi atom di dalam penyimpanan yang mendasarinya.
Setiap operasi terdapat dalam objek yang memiliki properti berikut: type
, key
, value
, dengan tipe 'put'
atau 'del'
. Dalam kasus 'del'
properti value
diabaikan. Entri apa pun dengan key
null
atau undefined
akan menyebabkan kesalahan dikembalikan pada callback
dan entri type: 'put'
dengan value
null
atau undefined
akan mengembalikan kesalahan.
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
diteruskan ke penyimpanan yang mendasarinya.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.batch()
(bentuk berantai) batch()
, ketika dipanggil tanpa argumen akan mengembalikan objek Batch
yang dapat digunakan untuk membangun, dan akhirnya melakukan, operasi batch atom. Bergantung pada cara penggunaannya, kinerja yang lebih baik dapat diperoleh saat menggunakan bentuk rantai batch()
di atas bentuk array.
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])
Mengantrikan operasi put pada batch saat ini, tidak dilakukan hingga write()
dipanggil pada batch. Argumen options
, jika disediakan, harus berupa objek dan diteruskan ke penyimpanan yang mendasarinya.
Metode ini mungkin throw
WriteError
jika ada masalah dengan put Anda (seperti value
null
atau undefined
).
batch.del(key[, options])
Mengantri operasi del pada batch saat ini, tidak dilakukan hingga write()
dipanggil pada batch. Argumen options
, jika disediakan, harus berupa objek dan diteruskan ke penyimpanan yang mendasarinya.
Metode ini mungkin throw
WriteError
jika ada masalah dengan penghapusan Anda.
batch.clear()
Hapus semua operasi antrian pada batch saat ini, semua operasi sebelumnya akan dibuang.
batch.length
Jumlah operasi yang diantri pada batch saat ini.
batch.write([options][, callback])
Komit operasi antrian untuk batch ini. Semua operasi yang tidak diselesaikan akan ditulis ke penyimpanan yang mendasarinya secara atom, artinya, semuanya akan berhasil atau gagal tanpa komitmen parsial.
Objek options
opsional diteruskan ke operasi .write()
objek batch yang mendasarinya.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.status
String yang hanya dapat dibaca yang merupakan salah satu dari:
new
- baru dibuat, tidak dibuka atau ditutupopening
- menunggu toko yang mendasarinya dibukaopen
- berhasil membuka toko, tersedia untuk digunakanclosing
- menunggu toko tutupclosed
- toko telah berhasil ditutup.db.isOperational()
Mengembalikan true
jika penyimpanan menerima operasi, yang dalam kasus levelup
berarti status
adalah opening
atau open
, karena toko membuka sendiri dan mengantri operasi hingga dibuka.
db.createReadStream([options])
Mengembalikan Aliran pasangan nilai kunci yang Dapat Dibaca. Sepasang adalah objek dengan properti key
dan value
. Secara default, ini akan mengalirkan semua entri di penyimpanan yang mendasarinya dari awal hingga akhir. Gunakan opsi yang dijelaskan di bawah ini untuk mengontrol jangkauan, arah, dan hasil.
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' )
} )
Anda dapat menyediakan objek opsi sebagai parameter pertama ke createReadStream()
dengan properti berikut:
gt
(lebih besar dari), gte
(lebih besar dari atau sama dengan) menentukan batas bawah rentang yang akan dialirkan. Hanya entri yang kuncinya lebih besar dari (atau sama dengan) opsi ini yang akan disertakan dalam rentang. Ketika reverse=true
urutannya akan dibalik, tetapi entri yang dialirkan akan sama.
lt
(kurang dari), lte
(kurang dari atau sama dengan) menentukan batas atas rentang yang akan dialirkan. Hanya entri yang kuncinya kurang dari (atau sama dengan) opsi ini yang akan disertakan dalam rentang. Ketika reverse=true
urutannya akan dibalik, tetapi entri yang dialirkan akan sama.
reverse
(boolean, default: false
) : mengalirkan entri dalam urutan terbalik. Berhati-hatilah karena cara kerja penyimpanan seperti LevelDB, pencarian terbalik bisa lebih lambat daripada pencarian maju.
limit
(angka, default: -1
) : membatasi jumlah entri yang dikumpulkan oleh aliran ini. Angka ini mewakili jumlah entri maksimum dan mungkin tidak tercapai jika Anda mencapai akhir rentang terlebih dahulu. Nilai -1
berarti tidak ada batasan. Ketika reverse=true
entri dengan kunci tertinggi akan dikembalikan, bukan kunci terendah.
keys
(boolean, default: true
) : apakah hasilnya harus berisi kunci. Jika disetel ke true
dan values
disetel ke false
maka hasilnya hanya berupa kunci, bukan objek dengan properti key
. Digunakan secara internal dengan metode createKeyStream()
.
values
(boolean, default: true
) : apakah hasilnya harus mengandung nilai. Jika disetel ke true
dan keys
disetel ke false
maka hasilnya hanya berupa nilai, bukan objek dengan properti value
. Digunakan secara internal oleh metode createValueStream()
.
db.createKeyStream([options])
Mengembalikan Aliran kunci yang Dapat Dibaca, bukan pasangan nilai kunci. Gunakan opsi yang sama seperti yang dijelaskan pada createReadStream()
untuk mengontrol jangkauan dan arah.
Anda juga dapat memperoleh aliran ini dengan meneruskan objek opsi ke createReadStream()
dengan keys
disetel ke true
dan values
disetel ke false
. Hasilnya setara; kedua aliran beroperasi dalam mode objek.
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])
Mengembalikan Aliran nilai yang Dapat Dibaca, bukan pasangan nilai kunci. Gunakan opsi yang sama seperti yang dijelaskan pada createReadStream()
untuk mengontrol jangkauan dan arah.
Anda juga dapat memperoleh aliran ini dengan meneruskan objek opsi ke createReadStream()
dengan values
yang disetel ke true
dan keys
disetel ke false
. Hasilnya setara; kedua aliran beroperasi dalam mode objek.
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])
Mengembalikan iterator abstract-leveldown
, yang menggerakkan aliran yang dapat dibaca di atas. Opsinya sama dengan opsi rentang createReadStream()
dan diteruskan ke penyimpanan yang mendasarinya.
Iterator ini mendukung for await...of
:
for await ( const [ key , value ] of db . iterator ( ) ) {
console . log ( value )
}
db.clear([options][, callback])
Hapus semua entri atau rentang. Tidak dijamin bersifat atomik. Menerima opsi rentang berikut (dengan aturan yang sama seperti pada iterator):
gt
(lebih besar dari), gte
(lebih besar dari atau sama dengan) menentukan batas bawah rentang yang akan dihapus. Hanya entri yang kuncinya lebih besar dari (atau sama dengan) opsi ini yang akan disertakan dalam rentang. Ketika reverse=true
urutannya akan dibalik, tetapi entri yang dihapus akan tetap sama.lt
(kurang dari), lte
(kurang dari atau sama dengan) menentukan batas atas rentang yang akan dihapus. Hanya entri yang kuncinya kurang dari (atau sama dengan) opsi ini yang akan disertakan dalam rentang. Ketika reverse=true
urutannya akan dibalik, tetapi entri yang dihapus akan tetap sama.reverse
(boolean, default: false
) : menghapus entri dalam urutan terbalik. Hanya efektif jika dikombinasikan dengan limit
, untuk menghapus N catatan terakhir.limit
(angka, default: -1
) : membatasi jumlah entri yang akan dihapus. Angka ini mewakili jumlah entri maksimum dan mungkin tidak tercapai jika Anda mencapai akhir rentang terlebih dahulu. Nilai -1
berarti tidak ada batasan. Ketika reverse=true
entri dengan kunci tertinggi akan dihapus, bukan kunci terendah. Jika tidak ada opsi yang diberikan, semua entri akan dihapus. Fungsi callback
akan dipanggil tanpa argumen jika operasi berhasil atau dengan WriteError
jika gagal karena alasan apa pun.
Jika tidak ada panggilan balik yang diteruskan, janji dikembalikan.
db.createWriteStream
? db.createWriteStream()
telah dihapus untuk menyediakan inti yang lebih kecil dan lebih mudah dipelihara. Ini terutama ada untuk membuat simetri dengan db.createReadStream()
tetapi melalui banyak diskusi, menghapusnya adalah tindakan terbaik.
Pendorong utama hal ini adalah kinerja. Meskipun db.createReadStream()
berkinerja baik pada sebagian besar kasus penggunaan, db.createWriteStream()
sangat bergantung pada kunci dan nilai aplikasi. Oleh karena itu, kami tidak dapat memberikan implementasi standar dan mendorong lebih banyak implementasi write-stream
yang dibuat untuk menyelesaikan kasus penggunaan spektrum luas.
Lihat implementasi yang dihasilkan komunitas di sini.
Setiap fungsi yang menerima panggilan balik akan mengembalikan janji jika panggilan balik tersebut dihilangkan. Satu-satunya pengecualian adalah konstruktor levelup
itu sendiri, yang jika tidak ada panggilan balik yang diteruskan akan dengan malas membuka penyimpanan yang mendasarinya di latar belakang.
Contoh:
const db = levelup ( leveldown ( './my-db' ) )
await db . put ( 'foo' , 'bar' )
console . log ( await db . get ( 'foo' ) )
levelup
adalah EventEmitter
dan memancarkan peristiwa berikut.
Peristiwa | Keterangan | Argumen |
---|---|---|
put | Kunci telah diperbarui | key, value (apa saja) |
del | Kunci telah dihapus | key (apa saja) |
batch | Batch telah dieksekusi | operations (array) |
clear | Entri telah dihapus | options (objek) |
opening | Toko yang mendasarinya sedang dibuka | - |
open | Toko telah dibuka | - |
ready | Alias open | - |
closing | Toko tutup | - |
closed | Toko telah tutup. | - |
error | Terjadi kesalahan | error (Kesalahan) |
Misalnya Anda dapat melakukan:
db . on ( 'put' , function ( key , value ) {
console . log ( 'inserted' , { key , value } )
} )
Penyimpanan seperti LevelDB aman untuk thread tetapi tidak cocok untuk diakses dengan banyak proses. Anda seharusnya hanya membuka toko dari satu proses Node.js. Cluster Node.js terdiri dari beberapa proses sehingga instance levelup
juga tidak dapat dibagikan di antara mereka.
Lihat Level/awesome
untuk modul seperti multileveldown
yang mungkin membantu jika Anda memerlukan satu penyimpanan untuk dibagikan ke seluruh proses.
Level/levelup
adalah Proyek Sumber Terbuka TERBUKA . Artinya:
Individu yang memberikan kontribusi signifikan dan berharga diberikan akses komitmen terhadap proyek untuk berkontribusi sesuai keinginan mereka. Proyek ini lebih seperti wiki terbuka daripada proyek sumber terbuka standar yang dilindungi.
Lihat Panduan Kontribusi untuk lebih jelasnya.
Platform Pengujian Lintas-browser dan Sumber Terbuka ♥ Disediakan oleh Sauce Labs.
Dukung kami dengan donasi bulanan di Open Collective dan bantu kami melanjutkan pekerjaan kami.
MIT