مثال على MongoDB findAndModify()

تعديل واستعادة وثيقة واحدة في MongoDB استنادًا إلى معايير الاختيار المدخلة. لا يتم عرض المحتوى المحدث للوثيقة المُسترجَعَة بشكل افتراضي. إذا لم تكن هناك سجلات تطابق المعايير في قاعدة البيانات، يتم إدخال سجل جديد إذا تم تعيين خاصية الإدخال الاختياري (upsert) على القيمة الصحيحة.

MongoDB findAndModify()

صيغة أسلوب findAndModify في MongoDB على النحو التالي.

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
})

وصف المعلمات على النحو التالي:query: يحدد معايير الاختيار التي تحتاج إلى تعديل السجل.sort: يحدد أي وثيقة يجب تعديلها عند استرداد معايير الاختيار لعدة وثائق.new: يشير إلى أن الوثيقة المعدلة ستظهر.fields: يحدد مجموعة الحقول التي يجب استردادها.upsert: ينشئ وثيقة جديدة إذا فشلت معايير الاختيار في استرداد وثيقة.

نقاط مهمة في استخدام findAndModify في MongoDB

بعض الأشياء التي يجب أخذها في الاعتبار عند استخدام استدعاءات findAndModify في MongoDB هي:

  • إذا لم يتم العثور على أية وثيقة باستخدام معايير الاختيار المدخلة وإذا تم تعيين upsert على القيمة الصحيحة ، يتم إدراج القيم المحددة وإنشاء وثيقة جديدة.
  • إذا لم يتم العثور على أية وثيقة باستخدام معايير الاختيار المدخلة أثناء تنفيذ عمليات التحديث أو الإزالة ، يتم إرجاع إخراج فارغ.
  • إذا تم تعيين الخيار الجديد على القيمة الخاطئة ولم يتم ذكر عملية الفرز ، يتم إرجاع الإخراج فارغ.
  • إذا تم تعيين الخيار الجديد على القيمة الخاطئة وتم ذكر عملية الفرز ، يكون الإخراج فارغا.

مثال على البحث والتعديل في MongoDB

لنرى الآن بعض الأمثلة التي توضح استخدام واجهة برمجة التطبيق findAndModify. أولاً ، دعونا ننشئ بعض البيانات التجريبية للبدء. سنقوم بإنشاء وثيقة سيارة جديدة تحتوي على حقول الاسم واللون ورقم السيارة (cno) والسرعة وبلد التصنيع (mfdcountry) عبر واجهة التحكم في مونغو.

db.car.insert(
[
{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
]
)

لنتحقق الآن مما تم إدراجه فعلاً باستخدام بحث مونغو:

db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

من خلال التحول إلى الاستخدام الفعلي للبحث والتعديل ، نصور إمكانيات مختلفة. الحالة 1: الوثيقة موجودة في قاعدة البيانات

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. يعثر الاستعلام على وثيقة في مجموعة السيارات حيث يكون حقل الاسم له القيمة Alto.
  2. \begin{Arabic}
    تقوم الفرز بترتيب نتائج الاستعلام بترتيب تصاعدي. إذا استوفت العديد من المستندات شرط الاستعلام، سيقوم الأسلوب باختيار التعديل لأول مستند حسب هذا الترتيب.
  3. يزيد التحديث قيمة حقل السرعة بمقدار 10.
  4. يُرجع الأسلوب المستند الأصلي المحدد لهذا التحديث:

الناتج:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}

الحالة 2: يتم تعيين الخيار الجديد على الصحيح (يُرجع مجموعة البيانات المحدثة)

db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})

الناتج:

{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}

يرجى ملاحظة أن السرعة تظهر كـ 45 وهي القيمة المحدثة حيث قمنا بتعيين القيمة الجديدة على أن تكون صحيحة. إذا لم يتم تعيين ذلك، سيتم عرض حقل السرعة كـ 20، القيمة القديمة على الرغم من أنها تحدث في قاعدة البيانات. الحالة 3: التحديث المشروط يتم تعيينه على الصحيح

db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})

الناتج:

db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

اسم السيارة مع WagonR ليس في قاعدة البيانات، لذا يتم إنشاء مستند جديد في قاعدة البيانات. يُرجع الأسلوب مستندًا فارغًا { } إذا تم تحديد خيار الفرز. إذا لم يتم تضمين خيار الفرز، سيُرجع الأسلوب قيمة null. بالإضافة إلى ذلك، يمكن استخدام ذلك أيضًا للقيام بعملية الفرز والإزالة. إذا تم تعيين حقل الإزالة على الصحيح، سيتم إزالة اسم السيارة بحسب المعايير المحددة من قاعدة البيانات.

db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

الناتج:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

تم تعيين حقل الإزالة على الصحيح، لذا يتم حذف المستند بالاسم “Alto” من قاعدة البيانات.

مثال جافا للبحث والتعديل في MongoDB</diy16}
\end{Arabic}

العمليات الموضحة أعلاه تتم جميعها يدويًا باستخدام واجهة سطر الأوامر في مونغو. يمكن القيام بنفس العمليات بشكل برمجي باستخدام لغة جافا كما يلي. قم بتحميل ملف مشغل مونغو وأضفه إلى مسار الفئة الخاص بك. أولاً ، نحتاج إلى إنشاء اتصال بخادم مونغودب باستخدام العميل مونغو. يجب تحديد اسم قاعدة البيانات كمعلمة للاتصال. إذا لم تكن قاعدة البيانات موجودة ، فسيتم إنشاء قاعدة بيانات جديدة. بعد ذلك ، سنضيف بضع سجلات إلى قاعدة البيانات ونقوم بعملية البحث والتعديل ، ثم نتحقق مما إذا كانت السجلات قد تم تحديثها فعليًا. يعمل البرنامج أدناه مع إصدارات مشغل جافا مونغو 2.x.

package com.journaldev.mongodb;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class MongoDBFindAndModify {

	public static void main(String[] args) throws UnknownHostException {
		 // احصل على اتصال جديد بقاعدة البيانات المفترضة للتشغيل. 
		MongoClient mongoClient = new MongoClient("localhost");
		 // استخدم "test" كقاعدة بيانات. استخدم قاعدة البيانات الخاصة بك هنا. 
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		 // أدخل بعض البيانات الاختبارية للبدء. 
		BasicDBObject obj = new BasicDBObject();
		obj.append("name", "Volkswagen");
		obj.append("color", "JetBlue");
		obj.append("cno", "H672");
		obj.append("speed", 62);
		obj.append("mfdcountry", "Italy");
		coll.insert(obj);
		
		 // عملية البحث والتعديل. قم بتحديث اللون إلى اللون الأزرق للسيارات التي لديها سرعة 
		 // < 45 
		DBObject query = new BasicDBObject("speed",
				new BasicDBObject("$lt", 45));
		DBObject update = new BasicDBObject();
		update.put("$set", new BasicDBObject("color", "Blue"));
		DBCursor cursor = coll.find();
		try {
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
		} finally {
			cursor.close();
		}
		coll.findAndModify(query, update);
	}
}

الناتج:

 // البيانات التجريبية قبل الإدخال 
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}


 // البيانات التجريبية بعد الإدخال 
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}


/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}


/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

إذا كنت تستخدم إصدارات مشغل جافا مونغو 3.x ، فيرجى استخدام البرنامج أدناه.

package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
 
public class MongoDBFindAndModify {
 
    public static void main(String[] args) throws UnknownHostException {
         // احصل على اتصال جديد بقاعدة البيانات المفترضة للتشغيل. 
        MongoClient mongoClient = new MongoClient("localhost");
        
         // استخدم "test" كقاعدة بيانات. استخدم قاعدة البيانات الخاصة بك هنا. 
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
         // أدخل بعض البيانات الاختبارية للبدء. 
        Document obj = new Document();
        obj.append("name", "Volkswagen");
        obj.append("color", "JetBlue");
        obj.append("cno", "H672");
        obj.append("speed", 62);
        obj.append("mfdcountry", "Italy");
        coll.insertOne(obj);
         
         // عملية البحث والتعديل. قم بتحديث اللون إلى اللون الأزرق للسيارات التي لديها سرعة > 45
        Bson query = new Document("speed",
                new Document("$gt", 45));
        Bson update = new Document("$set", 
        			new Document("color", "Blue"));
        
        System.out.println("before update");
        findAndPrint(coll);
        
        coll.findOneAndUpdate(query, update);
        
        System.out.println("after update of color field");
        findAndPrint(coll);
        
        mongoClient.close();

    }

	private static void findAndPrint(MongoCollection coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

الصورة أدناه تظهر نتيجة البرنامج أعلاه، لاحظ التغيير في حقل اللون. هذا كل شيء بالنسبة لمثال findAndModify في MongoDB، سنتطرق إلى المزيد من عمليات MongoDB في المقالات القادمة. المرجع: توثيق MongoDB الرسمي

Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example