דוגמה ל־MongoDB findAndModify()

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

  • אם קריטריוני הבחירה המוזנים לא מחזירים אף מסמך ואם upsert מוגדר ל- true, אז הערכים המצויינים מוכנסים ומסמך חדש נוצר.
  • אם קריטריוני הבחירה המוזנים לא מחזירים אף מסמך במהלך ביצוע פעולות עדכון או מחיקה, הפלט שמוחזר הוא null.
  • אם האפשרות החדשה מוגדרת ל- false ופעולת המיון אינה מצוינת, הפלט שמוחזר הוא null.
  • אם האפשרות החדשה מוגדרת ל- false ופעולת המיון מצוינת, הפלט הוא ריק.

דוגמת חיפוש ושינוי ב-MongoDB

כעת נראה כמה דוגמאות שמדגימות את שימוש API 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. המיון ממיין את תוצאות השאילתה בסדר עולה. אם ישנם מסמכים מרובים העומדים בתנאי השאילתה, השיטה תבחר לשינוי את המסמך הראשון כפי שהוזמן על ידי סדר זה.
  3. העדכון מגדיל את ערך שדה המהירות ב-10.
  4. השיטה מחזירה את המסמך המקורי שנבחר לעדכון זה:

פלט:

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

מקרה 2: האפשרות החדשה מוגדרת ל-true (מחזירה את סט הנתונים המעודכן)

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 שהיא הערך המעודכן מאחר והגדרנו ש-new יהיה true. אם זה לא מוגדר, שדה המהירות יוצג כ-20, הערך הישן אף שהוא מתעדכן במסד הנתונים. מקרה 3: ה-Upsert מוגדר ל-true

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. בנוסף לכך, ניתן גם להשתמש בזה לביצוע פעולת מיון והסרה. אם שדה ההסרה מוגדר ל-true, שם הרכב עם הקריטריונים המצוינים יוסר מהמסד הנתונים.

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

פלט:

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

שדה ההסרה מוגדר ל-true ולכן המסמך עם השם "Alto" נמחק מהמסד הנתונים.

דוגמא ל-Java של MongoDB findAndModify

הפעולות המתוארות לעיל מבוצעות ידנית באמצעות קופסת ה-Mongo. ניתן לבצע אותן באופן תכנותי ב-Java כך: הורד את קובץ הנהג של Mongo והוסף אותו ל- classpath שלך. תחילה, עלינו להציב חיבור לשרת ה-MongoDB באמצעות לקוח Mongo. שם המסד נתונים צריך להיות מפורט כפרמטר לחיבור. אם המסד נתונים לא קיים, יווצר מסד נתונים חדש. לאחר מכן, נוסיף מספר רשומות למסד הנתונים ונבצע פעולת findAndModify ולאחר מכן נוודא שהרשומות עודכנו בפועל. התוכנית למטה עובדת עם גרסאות דרייבר Mongo Java בגרסאות 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 {
		// קבל חיבור חדש ל-BD בהנחה שהוא פועל.

		MongoClient mongoClient = new MongoClient("localhost");
		// השתמש במבחן כמסד הנתונים. השתמש במסד הנתונים שלך כאן.

		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);
		
		// פעולת findAndModify. עדכן צבע לכחול לרכבים שיש להם מהירות < 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"}

אם אתה משתמש בדרייבר MongoDB Java גרסאות 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 {
        // קבל חיבור חדש ל-BD בהנחה שהוא פועל.

        MongoClient mongoClient = new MongoClient("localhost");
        
        // השתמש במבחן כמסד הנתונים. השתמש במסד הנתונים שלך כאן.

        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);
         
        // פעולת findAndModify. עדכן צבע לכחול לרכבים שיש להם מהירות > 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