اجرای مثال‌های عملی از CRUD - بخش اول

Practical Examples of CRUD - Part 1

MongoDB: اجرای مثال های عملی از CRUD - بخش اول (قسمت 07)

در قسمت قبل با عملیات های CRUD و مهم ترین متدهای آن ها آشنا شدیم. در این قسمت می خواهم به صورت عملی با انواع این متدها آشنا شویم. همانطور که می دانید از جلسه قبل چند document را در collection خودمان (flightData) ثبت کرده بودیم بنابراین برای اینکه از صفر شروع کنیم، می خواهم داده های درون این collection را حذف کنم.

در حال حاضر document های من به شکل زیر هستند (یاد گرفتیم که با دستور find قابل مشاهده است):

        "_id" : ObjectId("5e82de3aba557900a236a04c"),
        "departureAirport" : "MUC",                  
        "arrivalAirport" : "SFO",                    
        "aircraft" : "Airbus A380",                  
        "distance" : 12000,                          
        "intercontinental" : true                    
}                                                    
                                                     
        "_id" : "txl-1hr-1",                         
        "departureAirport" : "TXL",                  
        "arrivalAirport" : "LHR"                     
}                                                    
                                                     
        "_id" : ObjectId("5e82f08cba557900a236a04d"),
        "departureAirport" : "TXL",                  
        "arrivalAirport" : "LHR"                     
}                                                    

توضیح مهم: در طول این دوره ممکن است شما نخواهید از داده های من استفاده کنید، یا ممکن است document های من با شما تفاوت داشته باشد. همچنین در برخی از اوقات من document هایی را اضافه می کنم تا کار با آن ها را به شما نشان دهم و برای طولانی نشدن آموزش، فرآیند ثبت آن ها را ذکر نمی کنم. هیچ کدام از این مسائل هیچ اشکالی ندارند. مهم این است که نحوه کار هر کدام از دستورات را متوجه بشوید نه اینکه دقیقا مانند من جلو بیایید.

برای حذف کرده این داده ها می توانیم با deleteOne شروع کنیم:

db.flightData.deleteOne({})

اولین آرگومان deleteOne همان filter است که مانند یک شیء پاس داده می شود (علامت های {}). filter مشخص می کند که چه داده ای را پاک خواهید کرد. مثلا من می گویم اگر در یک document خصوصیت departureAirport برابر TXL باشد، آن document را حذف کن:

db.flightData.deleteOne({departureAirport: "TXL"})

دستور بالا از بین document های ما به دنبال موردی می گردد که departureAirport آن برابر TXL باشد. اگر چندین مورد داشته باشیم که در آن ها departureAirport برابر TXL باشد، فقط اولین مورد حذف می شود. با اجرای دستور بالا خروجی زیر را می گیرم:

{ "acknowledged" : true, "deletedCount" : 1 }

شما می توانید از هر فیلتر دیگری استفاده کنید. مثلا بر اساس id_ می توان گفت:

db.flightData.deleteOne({_id: "txl-1hr-1"})

حالا بیایید deleteMany را امتحان کنیم. شما نمی توانید مانند find از deleteMany بدون آرگومان استفاده کنید و حتما باید فیلتر خاصی را به آن بدهید (البته اگر یک شیء خالی را به عنوان فیلتر پاس بدهید، قبول می کند و تمام Document ها حذف می شوند چرا که هیچ فیلتر خاصی ذکر نشده است). در حال حاضر من دو document دارم که هیچ چیزی بین آن ها مشترک نیست تا بتوانم یکجا حذفشان کنم. بنابراین بیایید ابتدا آن ها را ویرایش کنیم.

db.flightData.updateOne({distance: 12000}, {$set: {marker: "delete"}})

پارامتر اولی که پاس داده ام همان فیلتر است (distance برابر 12000 باشد که می شود اولین document من). پارامتر دوم مقداری است که باید ویرایش شود یا اضافه شود. ما اگر بخواهیم داده ها را با updateOne ویرایش کنیم باید از یک دستور خاص به نام set$ استفاده کنیم. یعنی یک شیء که حاوی دستوری به نام set$ است و خود آن یک شیء دیگر دارد. کد بالا می گوید ابتدا document مورد نظر را طبق مشخصات فیلتر پیدا کن، سپس اگر خصوصیت marker در آن وجود داشت، مقدارش هر چه که باشد، به رشته delete تغییر داده شود اما اگر خصوصیت marker در آن document وجود نداشت، خودت آن را بساز و به عبارتی یک فیلد دیگر به document اضافه کن. من چنین خصوصیتی را ندارم بنابراین به document من اضافه می شود. با اجرای کد بالا خروجی زیر را می گیریم:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

matchedCount یعنی تعداد document هایی که بر اساس فیلتر ما پیدا شده و modifiedCount یعنی تعداد document هایی که ویرایش شده اند. حالا برای مشاهده تغییرات دستور زیر را اجرا می کنم:

db.flightData.find().pretty()

خروجی:

        "_id" : ObjectId("5e82de3aba557900a236a04c"),
        "departureAirport" : "MUC",
        "arrivalAirport" : "SFO",
        "aircraft" : "Airbus A380",
        "distance" : 12000,
        "intercontinental" : true,
        "marker" : "delete"
}

        "_id" : ObjectId("5e82f08cba557900a236a04d"),
        "departureAirport" : "TXL",
        "arrivalAirport" : "LHR"

همانطور که مشخص است، marker برای document اول اضافه شده است.

حالا فرض کنید که هدف ما اضافه کردن این marker به تمام document ها باشد. در این صورت می گوییم:

db.flightData.updateMany({}, {$set: {marker: "toDelete"}})

پارامتر اول که فیلتر است را به صورت یک شیء خالی پاس داده ام تا شرط خاصی نداشته باشیم و تمام ردیف ها هدف قرار بگیرند. سپس برای پارامتر دوم از همان دستور خاص set$ استفاده می کنیم (باید این کار را انجام بدهید) و این بار مقدار marker را toDelete می گذارم. با اجرای دستور بالا خروجی زیر را می گیریم:

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

acknowledged روی true است یعنی عملیات بدون خطا بوده است. matchedCount یعنی دو document با این فیلتر پیدا شده است که کل document های ما است. modifiedCount یعنی دو document ویرایش شده اند. document اول ما خصوصیت marker را داشت اما مقدار delete بود. با اجرای دستور بالا مقدارش به toDelete تغییر می کند. document دوم هم که این خصوصیت را نداشت، خصوصیت به آن اضافه خواهد شد. حالا با find.pretty از document های خود خروجی می گیریم:

       "_id" : ObjectId("5e82de3aba557900a236a04c"),
       "departureAirport" : "MUC",                  
       "arrivalAirport" : "SFO",                    
       "aircraft" : "Airbus A380",                  
       "distance" : 12000,                          
       "intercontinental" : true,                   
       "marker" : "toDelete"                        
                                                    
                                                    
       "_id" : ObjectId("5e82f08cba557900a236a04d"),
       "departureAirport" : "TXL",                  
       "arrivalAirport" : "LHR",                    
       "marker" : "toDelete"                        

ویرایش ها به درستی اعمال شده اند. در نهایت برای حذف کردن تمام document ها می گوییم:

db.flightData.deleteMany({marker: "toDelete"})

با این کار دیگر هیچ document ای نخواهیم داشت (اگر find را اجرا کنید، هیچ چیزی برگردانده نمی شود). همانطور که گفتم، ما می توانستیم از اول دستور زیر را برای حذف تمام ردیف ها انجام بدهیم و اصلا چیزی را ویرایش نکنیم:

db.flightData.deleteMany({})

پاس دادن یک شیء خالی به عنوان فیلتر، یعنی هیچ فیلتر یا شرطی نداریم و همه را پاک کن. چرا این کار را نکردیم؟ می خواستم با دستور udateOne و updateMany نیز آشنا شویم. در قسمت بعد عملیات های بیشتری را بررسی می کنیم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری دوره جامع آموزش MongoDB توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مقالات مرتبط
آخرین سوالات کاربران
5451218 در 1 سال قبل پرسیده:
ما را دنبال کنید
اینستاگرام روکسو تلگرام روکسو ایمیل و خبرنامه روکسو