در مقاله قبلی از بیلدر برای فیلترگذاری و مرتب سازی نتایج استفاده کردیم و در این مقاله هم برای به روزرسانی و ایندکس گذاری استفاده میکنیم.
به روزرسانی
کد زیر، تاریخ آخرین ورود کتب به انبار را به روزرسانی میکند؛ بدین صورت که اگر تاریخ آخرین به روزرسانی انبار کمتر یا مساوی ده روز است، آنرا برابر 5 روز قبل قرار دهد.
var update = Builders<Book>.Update.Set("LastStock", new DateTime().AddDays((-5))); var filter = Builders<Book>.Filter.Lte("LastStock", new DateTime().AddDays(-10)); collection.UpdateManyAsync(filter, update);
در بسیاری از موارد نیاز است که به روزرسانی یک فیلد، بسته به مقدار فعلیاش صورت بگیرد. برای مثال در کد زیر ما قصد داریم کتبی را که قیمت آنها بالای دویست هزار ریال است، سی هزار ریال از قیمت آنها کم کنیم:
var update = Builders<Book>.Update.Inc("Price", -30000); var filter = Builders<Book>.Filter.Gt("Price", 200000); collection.UpdateMany(filter, update);
حذف
جهت حذف یک سند از سیستم با توجه به مواردی که تا به الان داشتیم باید این حدس را زده باشید که برای حذف، باید از متد Delete استفاده کنیم و یک فیلتر را باید به عنوان شرط گذاری به عنوان پارامتر آن، در نظر بگیریم. کد زیر کتابهایی را که به زبان انگلیسی هستند، از کالکشن حذف میکند:
var filter = Builders<Book>.Filter.Eq("Language.Name", "English"); collection.DeleteMany(filter);
Language.Name
var client = new MongoClient(); var db = client.GetDatabase("publisher"); db.DropCollection("books");
var client = new MongoClient(); client.DropDatabase("publisher");
ایندکس گذاری Indexing
ایندکسها باعث میشوند که دسترسی سریعتری را به دادهها داشته باشیم و فیلدهایی را که در پرس و جوها مورد استفاده قرار میگیرند، سریعتر پیدا کنیم. به عنوان مثال فیلد Year فیلدی است که به احتمال زیاد در پرس و جوهایمان مرتبا استفاده خواهیم کرد تا به لیست کتب آن سال دسترسی سریعتری داشته باشیم. برای ایندکس گذاری هم از کلاس Builders استفاده میکنیم:
var index = Builders<Book>.IndexKeys.Ascending("Year"); collection.Indexes.CreateOneAsync(index);
ایندکسها ترکیبی Compound Index
حتی میتوانید این ایندکس گذاری را بر روی دو فیلد، یعنی به حالت ترکیبی هم انجام دهید:
var index = Builders<Book>.IndexKeys.Ascending("Year").Descending("LastStock"); collection.Indexes.CreateOneAsync(index);
مونگو برای جست و جو اسناد در سیستم خود، از ساختار Btree استفاده میکند و گرهها یا همان Nodeها در واقع به ترتیب خاصی در این درخت باینری قرار میگیرند.
اگر شما تنها به دنبال یک آیتم باشید، مرتب سازی تاثیری بر روی این جست و جو نخواهد داشت؛ ولی اگر چندین آیتم یا گره را بخواهید برگردانید، مرتب سازی باعث میشود که این آیتمها نزدیک یکدیگر باشند و سریعتر واکشی شوند. ولی اینکه این مرتب سازی صعودی یا نزولی باشد تاثیری بر روند آن ندارد. چرا که در هر دو حالت آیتمها نزدیک به یکدیگر هستند.
ولی اگر ایندکس شما ترکیبی باشد، این مرتب سازی تاثیر خودش را نشان خواهد داد. ابتدا درخت را بر اساس سال به صورت صعودی مرتب میکند و بعدا زیرمجموعه هر سال را بر اساس تاریخ آخرین به روزرسانی انبار به صورت نزولی مرتب میکند.
این نوع ایندکسها بر روی آرایههای یک فیلد به صورت خودکار ایجاد میگردند و لازم نیست تا خودتان دستی آنها را ایجاد کنید. موقعیکه فیلدی در کلاستان از نوع یک آرایه دارید، مقادیر این آرایه در درخت نیز لیست میشوند و به طور خودکار توسط این نوع اندیکس، ایندکس گذاری میشوند.
ایندکس جغرافیایی GeoSpatial Index
برای دادههای جرافیای میتوان این نوع ایندکس را پیاده سازی کرد. موقعیکه شما با مختصات جغرافیایی کار میکنید، این ایندکسها میتوانند به شما در بازیابی سریعتر مکانها و مختصات کمک کنند. از آنجا که مطالب این نوع ایندکسها تخصصیتر است، آن را به زمان دیگری موکول میکنیم.
var index2 = Builders<Book>.IndexKeys.Geo2D("Location"); var index3 = Builders<Book>.IndexKeys.Geo2DSphere("Location"); var index4 = Builders<Book>.IndexKeys.GeoHaystack("Location");
ایندکس متنی Text Index
این نوع ایندکسها بر روی فیلدهای نوع رشته String قرار داده میشوند تا جست و جوی عبارتها بین آنها سادهتر گردد. زمانیکه ما در مورد جست و جو در بین مطالب یک سایت صحبت میکنیم، سریعا عبارات Full Text Search یا Elastic و لوسین را به یاد میآوریم. در مونگو هم برای این نوع جست و جوها ایندکس Text را داریم که از این پس بتوانیم جست و جوی سریعتری بر روی آن داشته باشیم.
var index5 = Builders<Book>.IndexKeys.Text("Content");
قابلیتهای ایندکس گذاری این نوع دیتابیس حتی به مواردی چون Sharding ، SparseIndex ,TTL Indexes و ... هم میرسد که از حوصله مقاله فعلی خارج است و باید به زمان دیگری و در یک مقاله تخصصیتر آنها را بررسی کرد.
در قسمت بعدی، ذخیره و بازیابی فایلها در سطح دیتابیس را مورد بررسی قرار میدهیم.