از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
NeDB: یک پایگاه داده سبک وزن جاوا اسکریپت هنگامی که به یک پایگاه داده فکر می کنید، اولین چیزهایی که ممکن است به ذهن شما برسد ممکن است MySQL، MongoDB یا PostgreSQL باشد. در حالی که همه اینها گزینههای عالی برای ذخیرهسازی دادهها هستند، همه آنها برای اکثر برنامهها قدرت بیشتری دارند. یک برنامه چت دسکتاپ را در نظر بگیرید که با فریم ورک Electron در…
سرفصلهای مطلب
وقتی به یک پایگاه داده فکر می کنید، اولین چیزهایی که ممکن است به ذهن شما خطور کند ممکن است MySQL، MongoDB یا PostgreSQL باشد. در حالی که همه اینها گزینههای عالی برای ذخیرهسازی دادهها هستند، همه آنها برای اکثر برنامهها قدرت بیشتری دارند.
یک برنامه چت دسکتاپ را در نظر بگیرید که با آن نوشته شده است الکترون چارچوب در جاوا اسکریپت در حالی که دادههای چت (پیامها، مخاطبین، سابقه و غیره) احتمالاً از یک سرور API سرچشمه میگیرد، باید به صورت محلی در برنامه ذخیره شود. به طور بالقوه می توانید هزاران پیام داشته باشید که همه آنها برای دسترسی و جستجوی آسان باید ذخیره شوند.
پس چیکار میکنی؟ یک گزینه این است که همه این داده ها را در یک فایل در جایی ذخیره کنید و هر بار که نیاز به بازیابی آن دارید فقط آن را جستجو کنید، اما این می تواند ناکارآمد باشد. گزینه دیگر این است که داده ها را به صورت محلی ذخیره نکنید و هر بار که به داده های بیشتری نیاز دارید با سرور API تماس بگیرید، اما در این صورت برنامه شما کمتر پاسخگو خواهد بود و از داده های شبکه بسیار بیشتری استفاده می کند.
ایده بهتر این است که از یک پایگاه داده تعبیه شده/سبک استفاده کنید NeDB. این منطقی تر است زیرا برنامه شما به هزاران کاربر سرویس نمی دهد یا گیگابایت داده را مدیریت نمی کند.
NeDB بسیار شبیه است SQLite به این صورت که یک نسخه کوچکتر و قابل جاسازی از یک سیستم پایگاه داده بسیار بزرگتر است. NeDB به جای اینکه یک داده SQL کوچکتر باشد، یک داده ذخیره کوچک NoSQL است که تقلید می کند. MongoDB.
یک پایگاه داده سبک معمولاً داده های خود را یا در حافظه یا در یک فایل متنی ساده (با نمایه هایی برای جستجوی سریع) ذخیره می کند. این به کاهش ردپای کلی پایگاه داده کمک می کند روی سیستمی که برای برنامه های کوچکتر مناسب است. برای مقایسه، فایل MySQL tar (برای Mac OSX) 337 مگابایت است، در حالی که NeDB (فشرده نشده، کوچک نشده) تنها حدود 1.5 مگابایت است.
یکی از بزرگترین چیزهایی که در مورد NeDB به طور خاص وجود دارد این است که API آن زیرمجموعه ای از MongoDB API است، بنابراین اگر با MongoDB آشنا هستید، پس از راه اندازی اولیه مشکلی برای کار با NeDB ندارید.
توجه داشته باشید: از نسخه 1.8.0، NeDB هنوز به برخی از نامهای متد جدید Mongo بهروزرسانی نشده است، مانند insertOne
، insertMany
و حذف findOne
.
شروع کار با NeDB
ابتدا ماژول را با NPM نصب کنید:
$ npm install nedb --save
این ماژول با جاوا اسکریپت خالص نوشته شده است، بنابراین نباید هیچ مشکلی در کامپایل افزونه های بومی مانند درایورهای MongoDB وجود داشته باشد.
اگر در حال برنامه ریزی هستید روی در عوض با استفاده از آن در مرورگر، از Bower برای نصب استفاده کنید:
$ bower install nedb
مانند تمام سرویس گیرندگان پایگاه داده، اولین مرحله اتصال به پایگاه داده باطن است. با این حال، در این مورد هیچ برنامه خارجی برای اتصال وجود ندارد، بنابراین در عوض ما فقط باید مکان داده های شما را به آن بگوییم. با NeDB، چند گزینه برای ذخیره داده های خود دارید. اولین گزینه ذخیره داده ها در حافظه است:
var Datastore = require('nedb');
var db = new Datastore();
// Start issuing commands right away...
این کار شما را بدون داده شروع می کند و وقتی از برنامه خارج می شوید تمام داده های ذخیره شده از بین می روند. اگرچه برای استفاده در طول تست یا جلسات کوتاهتر (مانند مرورگر) عالی است.
یا گزینه دیگر ذخیره داده ها در یک فایل است. تفاوت اینجاست که باید محل فایل را مشخص کنید و داده ها را بارگذاری کنید.
var Datastore = require('nedb');
var db = new Datastore({ filename: 'path/to/your/file' });
db.loadDatabase(function(err) {
// Start issuing commands after callback...
});
اگه نمیخوای زنگ بزن db.loadDatabase
برای هر پایگاه داده ای که بارگیری می کنید، همیشه می توانید از آن استفاده کنید autoload: true
گزینه نیز
نکته مهمی که باید به آن توجه کنید این است که هر فایل معادل یک فایل است مجموعه در MongoDB بنابراین اگر چندین مجموعه دارید، باید چندین فایل را بارگذاری کنید روی استارت آپ. بنابراین ممکن است کد شما به شکل زیر باشد:
var Datastore = require('nedb');
var users = new Datastore({ filename: 'users.db', autoload: true });
var tweets = new Datastore({ filename: 'tweets.db', autoload: true });
var messages = new Datastore({ filename: 'messages.db', autoload: true });
ذخیره داده ها
پس از بارگیری داده های خود از فایل ها (یا ایجاد فضای ذخیره سازی در حافظه)، باید شروع به ذخیره داده ها کنید.
بسیار شبیه درایورهای Mongo، شما استفاده خواهید کرد insert
برای ایجاد یک سند جدید:
var Datastore = require('nedb');
var users = new Datastore();
var scott = {
name: 'Scott',
twitter: '@ScottWRobinson'
};
users.insert(scott, function(err, doc) {
console.log('Inserted', doc.name, 'with ID', doc._id);
});
// Prints to console...
// (Note that ID will likely be different each time)
//
// "Inserted Scott with ID wt3Nb47axiOpme9u"
این درج به راحتی می تواند برای ذخیره چندین سند در یک زمان گسترش یابد. با استفاده از همین روش، کافی است آرایه ای از اشیاء را ارسال کنید و هر کدام ذخیره می شوند و در تماس برگشتی به شما بازگردانده می شوند:
var Datastore = require('nedb');
var users = new Datastore();
var people = ();
var scott = {
name: 'Scott Robinson',
age: 28,
twitter: '@ScottWRobinson'
};
var elon = {
name: 'Elon Musk',
age: 44,
twitter: '@elonmusk'
};
var jack = {
name: 'Jack Dorsey',
age: 39,
twitter: '@jack'
};
people.push(scott, elon, jack);
users.insert(people, function(err, docs) {
docs.forEach(function(d) {
console.log('Saved user:', d.name);
});
});
// Prints to console...
//
// Saved user: Scott Robinson
// Saved user: Elon Musk
// Saved user: Jack Dorsey
بهروزرسانی اسناد موجود نیز تقریباً به همین صورت عمل میکند، با این تفاوت که باید یک پرسش ارائه دهید تا به سیستم بگویید کدام سند(های) باید بهروزرسانی شود.
در حال بارگیری داده ها
اکنون که مجموعه ای از داده های ذخیره شده داریم، زمان بازیابی آن ها از پایگاه داده است. باز هم، ما از همان قرارداد Mongo پیروی می کنیم find
روش:
var Datastore = require('nedb');
var users = new Datastore();
// Save a bunch of user data here...
users.findOne({ twitter: '@ScottWRobinson' }, function(err, doc) {
console.log('Found user:', doc.name);
});
// Prints to console...
//
// Found user: Scott Robinson
و دوباره، می توانیم از یک عملیات مشابه برای بازیابی چندین سند استفاده کنیم. داده های برگشتی فقط آرایه ای از اسناد منطبق هستند:
var Datastore = require('nedb');
var users = new Datastore();
// Save a bunch of user data here...
users.find({ age: { $lt: 40 }}, function(err, docs) {
docs.forEach(function(d) {
console.log('Found user:', d.name);
});
});
// Prints to console...
//
// Found user: Jack Dorsey
// Found user: Scott Robinson
ممکن است از آخرین نمونه کد متوجه شده باشید که NeDB، همانطور که انتظار دارید، قادر به پرس و جوهای پیچیده تری مانند مقایسه اعداد است. عملگرهای زیر همگی برای یافتن/تطبیق اسناد موجود هستند:
$lt
،$lte
: کمتر از، کمتر یا مساوی$gt
،$gte
: بزرگتر از، بزرگتر یا مساوی$in
: مقدار موجود در آرایه$nin
: مقداری که در آرایه موجود نیست$ne
: نا برابر$exists
: وجود (یا عدم وجود) یک ملک معین را بررسی می کند$regex
: رشته یک ویژگی را با regex مطابقت دهید
همچنین می توانید از عملیات مرتب سازی، محدود کردن، و پرش استاندارد استفاده کنید. اگر پاسخ تماسی به آن داده نشد find
روش، سپس الف Cursor
شی به جای آن به شما برگردانده می شود، که سپس می توانید از آن برای مرتب سازی، محدود کردن و پرش استفاده کنید. در اینجا نمونه ای از مرتب سازی بر اساس حروف الفبا بر اساس نام آورده شده است:
var Datastore = require('nedb');
var users = new Datastore();
// Save a bunch of user data here...
users.find({}).sort({name: 1}).exec(function(err, docs) {
docs.forEach(function(d) {
console.log('Found user:', d.name);
});
});
// Prints to console...
//
// Found user: Elon Musk
// Found user: Jack Dorsey
// Found user: Scott Robinson
دو عملیات دیگر، پرش و محدود کردن، بسیار شبیه به این کار می کنند.
تعداد کمی از اپراتورهای دیگر وجود دارد که توسط این پشتیبانی می شوند find
و findOne
روش ها، اما ما در اینجا به همه آنها نمی پردازیم. شما می توانید جزئیات بقیه این عملیات را در ادامه مطلب بخوانید یافتن اسناد بخش README
حذف داده ها
در مورد حذف داده ها چیز زیادی برای گفتن وجود ندارد به جز اینکه کارکرد آن شبیه به آن است find
مواد و روش ها. برای یافتن سند(های) مربوطه در پایگاه داده از انواع مشابهی از پرس و جوها استفاده خواهید کرد. آنهایی که پیدا می شوند سپس حذف می شوند.
var Datastore = require('nedb');
var users = new Datastore();
// Save a bunch of user data here...
users.remove({ name: { $regex: /^Scott/ } }, function(err, numDeleted) {
console.log('Deleted', numDeleted, 'user(s)');
});
// Prints to console...
//
// Deleted 1 user(s)
به طور پیش فرض، remove
روش فقط یک سند را حذف می کند. برای حذف چندین سند با یک تماس، باید آن را تنظیم کنید multi
گزینه ای به true
.
var Datastore = require('nedb');
var users = new Datastore();
// Save a bunch of user data here...
users.remove({}, { multi: true }, function(err, numDeleted) {
console.log('Deleted', numDeleted, 'user(s)');
});
// Prints to console...
//
// Deleted 3 user(s)
نمایه سازی داده ها
درست مانند هر پایگاه داده دیگری، می توانید شاخص ها را تنظیم کنید روی دادههای شما برای بازیابی سریعتر یا اعمال محدودیتهای خاص، مانند مقادیر منحصربهفرد. برای ایجاد ایندکس، از ensureIndex
روش.
سه نوع شاخصی که در حال حاضر پشتیبانی می شوند عبارتند از:
unique
: اطمینان حاصل کنید که فیلد داده شده در کل مجموعه منحصر به فرد استsparse
: اسنادی را که فیلد داده شده در آنها تعریف نشده است فهرست نکنیدexpireAfterSeconds
: بعد از مدت زمان معین سند را حذف کنید (زمان برای زندگی، یا TTL)
به نظر من، شاخص TTL بسیار مفید است، زیرا شما را از نوشتن کد برای اسکن و حذف مکرر داده هایی که منقضی شده اند نجات می دهد.
این می تواند مفید باشد، برای مثال، با درخواست های بازنشانی رمز عبور. اگر شما یک PasswordReset
شی ذخیره شده در پایگاه داده شما، نمی خواهید برای همیشه معتبر باشد. برای کمک به محافظت از کاربر، احتمالاً باید منقضی شود و پس از چند روز حذف شود. این شاخص TTL می تواند آن را برای شما حذف کند.
در مثال زیر، ما را قرار داده ایم unique
محدودیت روی دسته های توییتر اسناد این بدان معنی است که اگر کاربر با همان دسته توییتر کاربر دیگر ذخیره شود، خطا ایجاد می شود.
var Datastore = require('nedb');
var users = new Datastore();
users.ensureIndex({ fieldName: 'twitter', unique: true });
var people = ();
var jack = {
name: 'Jack Dorsey',
age: 39,
twitter: '@jack'
};
var jackSmith = {
name: 'Jack Smith',
age: 68,
twitter: '@jack'
};
people.push(jack, jackSmith);
users.insert(people, function(err, docs) {
console.log('Uh oh...', err);
});
// Prints to console...
//
// Uh oh... Can't insert key @jack, it violates the unique constraint
گرفتن آن بیشتر
در حالی که استفاده از NeDB API و همه چیز آسان است، اگر کد شما به خوبی طراحی و سازماندهی نشده باشد، کار کردن با آن بسیار دشوار است. اینجا جایی است که نگاشت اسناد شی (که مانند یک ORM است) بیا تو بازی.
با استفاده از Camo ODM (که من ایجاد کردم)، شما به سادگی می توانید داده های NeDB را به عنوان کلاس های جاوا اسکریپت در نظر بگیرید. این به شما امکان می دهد یک طرح واره را مشخص کنید، داده ها را تأیید کنید، طرحواره ها را گسترش دهید و موارد دیگر. کامو حتی با MongoDB نیز کار میکند، بنابراین میتوانید از NeDB در محیطهای آزمایش/توسعه استفاده کنید و سپس بدون نیاز به تغییر هیچ کدی از Mongo برای سیستم تولید خود استفاده کنید.
در اینجا یک مثال سریع از اتصال به پایگاه داده، اعلام یک شی کلاس و ذخیره برخی از داده ها آورده شده است:
var connect = require('camo').connect;
var Document = require('camo').Document;
class User extends Document {
constructor() {
super();
this.name = String;
this.age = Number;
this.twitter = Sring;
}
get firstName() {
return this.name.split(' ')(0);
}
}
var scott = User.create({
name: 'Scott Robinson',
age: 28,
twitter: '@ScottWRobinson'
});
var elon = User.create({
name: 'Elon Musk',
age: 44,
twitter: '@elonmusk'
});
connect('nedb://memory').then(function(db) {
return Promise.all((scott.save(), elon.save()));
}).then(function(users) {
users.forEach(function(u) {
console.log('Saved user:', u.firstName);
});
return elon.delete();
}).then(function() {
console.log('Deleted Elon!')
});
// Prints to console...
//
// Saved user: Scott
// Saved user: Elon
// Deleted Elon!
این ODM بسیار بیشتر از آنچه من در اینجا نشان داده ام وجود دارد. برای اطلاعات بیشتر، این مقاله یا مقاله را بررسی کنید README پروژه برای مستندات
نتیجه
از آنجایی که NeDB بسیار کوچک است (و بسیار سریع!)، اضافه کردن آن به تقریباً هر پروژه ای بسیار آسان است. و با Camo در ترکیب، شما فقط به چند خط کد نیاز دارید تا اشیاء مبتنی بر کلاس را اعلام کنید که ایجاد، حذف و دستکاری آنها بسیار آسان تر است.
اگر تا به حال از NeDB در یکی از پروژه های خود استفاده کرده اید، ما دوست داریم در مورد آن بشنویم. در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# توضیح داده شده
منتشر شده در 1403-01-28 19:50:05