English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
طريقة الحفاظ على الأتمومية في التوصيات هي الحفاظ على جميع المعلومات ذات الصلة، والتي يتم استخدامها عادةً بتحديث جميع الوثائق المدمجة إلى وثيقة واحدة. سيضمن ذلك أن تكون جميع التحديثات للوثيقة الواحدة أتمومية.
إذا كان قد قمنا بإنشاء مجموعة تحت اسم productDetails، وإدراج وثيقة فيها، كما هو موضح أدناه-
>db.createCollection("products") { "ok" : 1 } > db.productDetails.insert( { "_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" } ] } ) WriteResult({ "nInserted" : 1 }) >
في هذا المستند، سنقوم بتعيين معلومات العملاء الذين قاموا بشراء المنتجات في حقل product_bought_by. الآن، كلما قام عميل جديد بشراء منتج، سنقوم أولاً بالتحقق من إمكانية استخدامه من خلال حقل product_available. إذا كان متاحًا، سنقلل من قيمة product_available، وسنقوم بإدراج مستند العملاء الجدد في حقل product_bought_by. سنستخدم الأمر findAndModify لهذا الغرض، لأن عملية البحث والتحديث للوثائق متطابقة.
>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"}} } }
نستخدم طريقة تعيين المستندات وإجراء استعلامات findAndModify لضمان تحديث معلومات شراء المنتج فقط عندما يكون المنتج متاحًا. يتم تنفيذ كل عملية في نفس الاستعلام، وهو أتمومي.
على العكس من ذلك، تأمل في الحالة التالية: قد حفظنا توفر المنتج ومعلومات من الذي اشترى المنتج. في هذه الحالة، سنستخدم الاستعلام الأول للتحقق من توفر المنتج أولاً. ثم سنحدث معلومات الشراء في الاستعلام الثاني. ولكن، من الممكن أن يشتري مستخدمون آخرون المنتج بين تنفيذ هذين الاستعلامين، مما يجعل المنتج غير متاح. دون معرفة ذلك، سيستند استعلامنا الثاني إلى نتائج استعلامنا الأول لتحديث معلومات الشراء. هذا سيفعل عدم التزامن في قاعدة البيانات، لأننا قد قمنا ببيع منتج غير متاح.