با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، این جلسه از آموزش های MongoDB به عملیات اتمی در MongoDB اختصاص داده می شود.MongoDB عملیات اتمی چند سند را پشتیبانی نمی کند. با این حال، این عملیات اتمی را بر روی یک سند فراهم می آورد. بنابراین اگر یک سند دارای صد فیلد باشد، بایستی به روز رسانی تمام فیلدها یا هیچ کدام را به روز رسانی کند، بنابراین در MongoDB عملیات اتمی در سطح سند حفظ خواهد شد.
رویکرد توصیه شده برای حفظ اتمی بودن این است که تمام اطلاعات مربوطه را حفظ کند.
همچنین به طور مرتب در یک سند تکاملی با استفاده از اسناد embedded به روز رسانی شود.
با این کار اطمینان حاصل می شود که همه به روز رسانی ها برای یک سند تک اتمی هستند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "_id":1, "product_name": "Samsung S3", "category": "mobiles", "product_total": 5, "product_available": 3, "product_bought_by": [ { "customer": "john", "date": "7-Jan-2014" }, { "customer": "mark", "date": "8-Jan-2014" } ] } |
در این سند ما اطلاعات مشتری که محصول را خریداری کرده در فیلد product_bought_by ذخیره کرده ایم.
سپس، هر زمان که مشتری جدید خریداری می کند، ابتدا محصول مورد نظر را با استفاده از فیلد product_available بررسی می کنیم.
اگر در دسترس باشد، مقدار فیلد product_available را کاهش می دهیم و همچنین سند خریداری شده مشتری جدید را در فیلد product_bought_by وارد می کنیم.
ما از دستور findAndModify برای این قابلیت استفاده خواهیم کرد زیرا این سند را به همان شیوه جستجو و به روزرسانی می کند.
1 2 3 4 5 6 7 | >db.products.findAndModify({ query:{_id:2,product_available:{$gt:0}}, update:{ $inc:{product_available:-1}, $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} } }) |
با رویکرد ما از سند تعبیه شده و با استفاده از query findAndModify اطمینان حاصل می شود :
که اطلاعات خرید محصول فقط در صورتی که محصول در دسترس باشد، به روز رسانی می شود. کل این عملیات در کوئری، اتمی است. در مقایسه با این، سناریو را در نظر بگیرید که ممکن است در دسترس بودن محصول و اطلاعات مربوط به اینکه کدام محصول را به صورت جداگانه خریداری کرده ایم را در نظر بگیرید.
در این مورد، ابتدا محصول مورد نظر را با استفاده از اولین کوئری بررسی خواهیم کرد.
سپس در کوئری دوم، اطلاعات خرید را به روزرسانی می کنیم.
با این حال، ممکن است که بین اجرای این دو کوئری ، برخی دیگر از کاربران این محصول را خریداری کنند و دیگر در دسترس نباشد.
بدون اطلاع از این، کوئری دوم اطلاعات خرید را بر اساس نتیجه اولین کوئری به روز رسانی می کند.
این عمل پایگاه داده را متناقض می کند زیرا ما یک محصول را که در دسترس نیست فروختیم.