مثال تعليمي عن استخدام MongoDB في Java لعمليات CRUD

مرحبًا بك في درس مثال MongoDB Java. في وقت سابق، تعلمنا كيفية تثبيت MongoDB على أجهزة Unix وتنفيذ بعض الأوامر من خلال الطرفية. اليوم سنتناول ميزات سائق MongoDB Java وكيفية أداء العمليات الشائعة للـ CRUD (الإنشاء، القراءة، التحديث، الحذف).

MongoDB Java

  1. تحميل سائق MongoDB Java

  2. إنشاء اتصال MongoDB Java

  3. الاتصال بقاعدة بيانات MongoDB

  4. MongoDB والمجموعات

  5. مثال MongoDB Java

  6. تنزيل مشغل MongoDB للغة Java

    إذا كان لديك مشروع Maven، قم فقط بإضافة التبعية التالية لتضمين مشغل MongoDB للغة Java في تطبيقك.

    <dependency>
    	<groupId>org.mongodb</groupId>
    	<artifactId>mongo-java-driver</artifactId>
    	<version>2.12.3</version>
    </dependency>
    

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

  7. إنشاء اتصال MongoDB بلغة Java

    MongoClient هو الواجهة بين برنامجنا بلغة Java وخادم MongoDB. يُستخدم MongoClient لإنشاء الاتصال، والاتصال بقاعدة البيانات، واسترجاع أسماء المجموعات، وإنشاء/قراءة/تحديث/حذف قاعدة البيانات، المجموعات، والوثيقة وغيرها. إحدى ميزات سائق MongoDB للغة Java التي أحبها أكثر هي أنها آمنة للتداول بالخيوط، لذا يمكننا إنشاء مثيل من MongoClient مرة واحدة وإعادة استخدامه. حتى إذا قامت عدة خيوط بالوصول إليه في وقت واحد، يتم إرجاع اتصال من تجمع الاتصال الداخلي الذي يتم الحفاظ عليه. بالنسبة لكل طلب إلى قاعدة البيانات (البحث، الإدراج، إلخ)، ستحصل خيط Java على اتصال من التجمع، ينفذ العملية، ويفرج عن الاتصال. وهذا يعني أن الاتصال (المأخوذ) قد يكون مختلفًا في كل مرة. فيما يلي بعض الطرق الشائعة للاتصال بخادم MongoDB.

    MongoClient mongoClient = new MongoClient(); // يتصل بالمضيف والمنفذ الافتراضي، أي 127.0.0.1:27017
    // أو
    MongoClient mongoClient = new MongoClient("localhost"); // يتصل بالمنفذ الافتراضي، أي 27017
    // أو
    MongoClient mongoClient = new MongoClient("localhost", 27017); // يجب استخدام هذا دائمًا
    
    // أو، للاتصال بمجموعة نسخ متطابقة، مع اكتشاف تلقائي للرئيسي
    MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017),
    new ServerAddress("localhost", 27018),
    new ServerAddress("localhost", 27019)));
    
  8. اتصال بقاعدة بيانات MongoDB

    بمجرد الحصول على اتصال بخادم MongoDB، الخطوة التالية هي إنشاء اتصال بقاعدة البيانات، كما هو موضح أدناه. يرجى ملاحظة أنه إذا لم تكن قاعدة البيانات موجودة، ستقوم MongoDB بإنشائها لك.

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    

    يوفر MongoClient طريقة مفيدة للحصول على جميع أسماء قواعد البيانات، كما هو موضح أدناه.

    MongoClient mongo = new MongoClient("localhost", 27017);
    List<String> dbs = mongo.getDatabaseNames();
    System.out.println(dbs); // [journaldev, local, admin]
    

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

    MongoCredential journaldevAuth = MongoCredential.createPlainCredential("pankaj", "journaldev", "pankaj123".toCharArray());
    MongoCredential testAuth = MongoCredential.createPlainCredential("pankaj", "test", "pankaj123".toCharArray());
    List<MongoCredential> auths = new ArrayList<MongoCredential>();
    auths.add(journaldevAuth);
    auths.add(testAuth);
    
    ServerAddress serverAddress = new ServerAddress("localhost", 27017);
    MongoClient mongo = new MongoClient(serverAddress, auths);
    

    إذا كنت تستخدم إصدارات أقدم، يجب عليك تقديم تفاصيل المصادقة بعد الحصول على كائن قاعدة البيانات كما هو موضح أدناه.

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    boolean auth = db.authenticate("pankaj", "pankaj123".toCharArray());
    

    يمكنك بسهولة اكتشاف العيوب في النهج السابق، يجب القيام بالمصادقة في مرحلة مبكرة لأنه لا يمكننا الاسترداد منها. يمكننا حذف قاعدة بيانات إما باستخدام MongoClient dropDatabase(String db) أو باستخدام DB dropDatabase(). نظرًا لأننا نقوم بحذف قاعدة البيانات، أفضل استخدام طريقة MongoClient.

  9. مونغو دي بي والمجموعات

    يمكن لكل قاعدة بيانات أن تحتوي على صفر أو عدة مجموعات، فهي مثل الجداول في خوادم قواعد البيانات العلاقية باستثناء أنه ليس لديك تنسيق محدد للبيانات. فكر فيها مثل قائمة عامة مقابل قائمة من السلاسل في لغة برمجة جافا. يمكننا الحصول على جميع أسماء المجموعات باستخدام الكود التالي.

    MongoClient mongo = new MongoClient("localhost", 27017);
    DB db = mongo.getDB("journaldev");
    		
    Set<String> collections = db.getCollectionNames();
    System.out.println(collections); // [datas, names, system.indexes, users]
    

    يمكننا الحصول على مجموعة معينة عن طريق توفير اسمها، كما هو موضح أدناه.

    DB db = mongo.getDB("journaldev");	
    DBCollection col = db.getCollection("users");
    

    مرة أخرى، إذا لم تكن المجموعة موجودة، فستقوم مونغو دي بي بإنشائها لك. تذهب جميع البيانات في مونغو دي بي إلى بعض المجموعات، لذا في هذه النقطة نحن جاهزون لأداء عمليات الإدراج / التحديث / الحذف. يمكننا استخدام DBCollection drop() لإسقاط مجموعة من قاعدة البيانات.

  10. مثال على MongoDB Java

Even though we can work on any valid JSON document in MongoDB collection, in real life we have POJO classes that are mapped with these data. So I will create a java bean and use it for my examples. `User.java`

```
package com.journaldev.mongodb.model;

public class User {

	private int id;
	private String name;
	private String role;
	private boolean isEmployee;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	public boolean isEmployee() {
		return isEmployee;
	}
	public void setEmployee(boolean isEmployee) {
		this.isEmployee = isEmployee;
	}
}
```

Here is the complete MongoDB java example program showing all the CRUD operations one by one. `MongoDBExample.java`

```
package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import com.journaldev.mongodb.model.User;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;

public class MongoDBExample {

	public static void main(String[] args) throws UnknownHostException {
	
		User user = createUser();
		DBObject doc = createDBObject(user);
		
		MongoClient mongo = new MongoClient("localhost", 27017);
		DB db = mongo.getDB("journaldev");
		
		DBCollection col = db.getCollection("users");
		
		// إنشاء مستخدم
		WriteResult result = col.insert(doc);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		// مثال قراءة
		DBObject query = BasicDBObjectBuilder.start().add("_id", user.getId()).get();
		DBCursor cursor = col.find(query);
		while(cursor.hasNext()){
			System.out.println(cursor.next());
		}
		
		// مثال تحديث
		user.setName("Pankaj Kumar");
		doc = createDBObject(user);
		result = col.update(query, doc);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		// مثال حذف
		result = col.remove(query);
		System.out.println(result.getUpsertedId());
		System.out.println(result.getN());
		System.out.println(result.isUpdateOfExisting());
		System.out.println(result.getLastConcern());
		
		// إغلاق الموارد
		mongo.close();
	}

	private static DBObject createDBObject(User user) {
		BasicDBObjectBuilder docBuilder = BasicDBObjectBuilder.start();
								
		docBuilder.append("_id", user.getId());
		docBuilder.append("name", user.getName());
		docBuilder.append("role", user.getRole());
		docBuilder.append("isEmployee", user.isEmployee());
		return docBuilder.get();
	}

	private static User createUser() {
		User u = new User();
		u.setId(2);
		u.setName("Pankaj");
		u.setEmployee(true);
		u.setRole("CEO");
		return u;
	}
	
	

}
```

A sample execution results in following output.

```
null
0
false
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
{ "_id" : 2 , "name" : "Pankaj" , "role" : "CEO" , "isEmployee" : true}
null
1
true
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
null
1
false
WriteConcern { "getlasterror" : 1} / (Continue on error? false)
```

Notice that I am saving User id with **\_id** name, this is a reserved key for the primary key of any record in the collection. If we don't provide one, MongoDB will create one for us. It's like sequencer or auto increment column in relational database tables. Since I am deleting the created record, further execution won't cause any issues. But if there are duplicate record, then we will get below errors.

```
Exception in thread "main" com.mongodb.MongoException$DuplicateKey: { "serverUsed" : "localhost:27017" , "ok" : 1 , "n" : 0 ,
 "err" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: journaldev.users.$_id_  dup key: { : 1 }" , 
"code" : 11000}
	at com.mongodb.CommandResult.getWriteException(CommandResult.java:88)
	at com.mongodb.CommandResult.getException(CommandResult.java:79)
	at com.mongodb.DBCollectionImpl.translateBulkWriteException(DBCollectionImpl.java:314)
	at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:189)
	at com.mongodb.DBCollectionImpl.insert(DBCollectionImpl.java:165)
	at com.mongodb.DBCollection.insert(DBCollection.java:93)
	at com.mongodb.DBCollection.insert(DBCollection.java:78)
	at com.mongodb.DBCollection.insert(DBCollection.java:120)
	at com.journaldev.mongodb.main.MongoDBExample.main(MongoDBExample.java:27)
```

هذا كل شيء لبدء العمل مع سائق MongoDB Java ، سننظر في المزيد من الميزات في المشاركات القادمة.

Source:
https://www.digitalocean.com/community/tutorials/mongodb-java-crud-example-tutorial