MongoDB Javaの例チュートリアルへようこそ。以前は、UnixマシンにMongoDBをインストールする方法と、ターミナルからいくつかのコマンドを実行する方法を学びました。今日は、MongoDB Javaドライバーの機能と一般的なCRUD(作成、読み取り、更新、削除)操作の方法について見ていきます。
MongoDB Java
-
MongoDB Java Driver ダウンロード
もしMavenプロジェクトをお使いの場合、以下の依存関係を追加して、MongoDBのJavaドライバーをアプリケーションに組み込むことができます。
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.12.3</version> </dependency>
単独のプロジェクトをお持ちの場合、この リンク からMongoDB Java Driverをダウンロードし、プロジェクトのビルドパスに組み込んでください。それでは、MongoDBのJavaドライバーの基本的な使用法を確認し、その後CRUD操作に関する MongoDB Javaの例 プログラムを見ていきましょう。
-
MongoDB Java Connectionの作成
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)));
-
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メソッドを好みます。 -
MongoDBとコレクション
すべてのデータベースには0個以上のコレクションが存在します。これらは、リレーショナルデータベースサーバーのテーブルのようなものですが、データの特定の形式はありません。Javaプログラミング言語の一般的なリストと文字列のリストの違いのように考えてください。以下のコードを使用して、すべてのコレクションの名前を取得できます。
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");
もしコレクションが存在しない場合は、MongoDBが自動的に作成します。MongoDBのすべてのデータは、いずれかのコレクションに入ります。したがって、この時点で挿入/更新/削除操作を実行する準備が整いました。データベースからコレクションを削除するには、
DBCollection
のdrop()
メソッドを使用できます。 -
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