8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MongoDB基礎:JAVAでCRUDから入門

Last updated at Posted at 2019-09-21

#はじめに
MongoDBは、NoSQLの世界ではドキュメント型の代表者であり、CRUDの実装は簡単です。
JAVAでCRUDのAPIを利用して簡単にまとめます。

#ドライバライブラリ導入

build.gradle
// https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
compileInclude group: 'org.mongodb', name: 'mongo-java-driver', version: '3.11.0'

#Create
##インサートイメージ
image.png

##JAVAインサートサンプル

MongoDBTest.java
package mongodb;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import org.bson.Document;

public class MongoDBTest {

	public static void main(String[] args) {
		// MongoDBクライントを生成する
		MongoClient client = MongoClients.create("mongodb://localhost:27017");
		// DBオブジェクトを取得する
		MongoDatabase db = client.getDatabase("mydb");
		// ユーザーコレクションを取得する
		MongoCollection<Document> users = db.getCollection("users");

		// ユーザーの属性をセット
		Document user = new Document();
		user.append("lastName", "tanaka");
		user.append("firstName", "ichiro");
		user.append("gender", "男性");

		// DBにインサート
		users.insertOne(user);

		// クライントを閉じる
		client.close();
	}
}

##コレクションイメージ
image.png

複数インサート

List<Document> userList = new ArrayList<Document>();
		
Document user1 = new Document();
user1.append("lastName", "tanaka");
		
Document user2 = new Document();
user2.append("lastName", "yamada");
		
userList.add(user1);
userList.add(user2);
		
// リストをDBにインサート
users.insertMany(userList);

#Read
##検索イメージ
image.png

##Find One
db.collection.find(filter).first()の感じで一件目を取得する。_idで検索したい場合はfirstメソッドが便利です。

MongoDBTest.java
package mongodb;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;

import org.bson.Document;
import org.bson.types.ObjectId;

public class MongoDBTest {

	public static void main(String[] args) {
		// MongoDBクライントを生成する
		MongoClient client = MongoClients.create("mongodb://localhost:27017");
		// DBオブジェクトを取得する
		MongoDatabase db = client.getDatabase("mydb");
		// ユーザーコレクションを取得する
		MongoCollection<Document> users = db.getCollection("users");

		// _idで検索する
		Document user = users.find(Filters.eq("_id", new ObjectId("5d858b36c491de05900c4e32"))).first();
		if (user != null) {
			System.out.println("lastName:" + user.getString("lastName"));
		}

		// クライントを閉じる
		client.close();
	}
}

出力:

lastName:tanaka

##Find List
findメソッドのパラメータに検索条件を渡すと絞り込むことは可能です。
Filtersクラスではいろんなメソッドを用意されています。
image.png
image.png

###検索サンプル

// 姓で複数人を検索する
MongoCursor<Document> cursor = users.find(Filters.or(Filters.in("lastName", "tanaka", "yamada"))).cursor();
while (cursor.hasNext()) {
    Document user = (Document) cursor.next();
    // do something
}

// Cursorではなく、リストに変換しても便利です。
// List<Document> documents = users.find(Filters.or(Filters.in("lastName", "tanaka", "yamada"))).into(new ArrayList<Document>());

### ソート、skip,limitなど

Document sort = new Document();
sort.append("updateDate", -1);
MongoCursor<Document> cursor = users.find(Filters.in("lastName", "tanaka", "yamada")).sort(sort).skip(20).limit(10).cursor();

#Update

更新イメージ

image.png

##Update One

updateOneメソッドで1件のデータを更新

MongoDBTest.java
package mongodb;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import java.util.Date;

import org.bson.Document;
import org.bson.types.ObjectId;

public class MongoDBTest {

	public static void main(String[] args) {
		// MongoDBクライントを生成する
		MongoClient client = MongoClients.create("mongodb://localhost:27017");
		// DBオブジェクトを取得する
		MongoDatabase db = client.getDatabase("mydb");
		// ユーザーコレクションを取得する
		MongoCollection<Document> users = db.getCollection("users");
		
		// 更新条件
		Document filter = new Document();
		filter.append("_id", new ObjectId("5d858b36c491de05900c4e32"));
		
		// 更新データ
		Document updateSet = new Document();
		updateSet.append("lastName", "鈴木");
		updateSet.append("updateDate", new Date());
		
		// updateオブジェクト
		Document update = new Document();
		update.append("$set", updateSet);
		
		// 更新
		users.updateOne(filter , update);
		
		// クライントを閉じる
		client.close();
	}
}

###更新後のコレクションのデータ
image.png

##Update Many
条件と一致するデータを更新したい場合はupdateManyメソッドを使います。
image.png

更新のマニュアル:https://docs.mongodb.com/manual/tutorial/update-documents/

##Replace One
ドキュメントを一部データ更新ではなく、完全差し替えの場合は、replaceOneメソッドを使います。

image.png

// 更新条件
Document filter = new Document();
filter.append("_id", new ObjectId("5d858b36c491de05900c4e32"));
		
// 更新データ
Document update = new Document();
update.append("lastName", "鈴木");
update.append("updateDate", new Date());
		
// 差し替え
users.replaceOne(filter, update);

一点注意したいのは、DBで検索したドキュメントを差し替えデータとして処理すると、エラーになります。
悪い例:

// DBからデータ取得
Document user = users.find(Filters.eq("_id", new ObjectId("5d858b36c491de05900c4e32"))).first();
user.append("memo", "new user");
		
// 差し替え(違う_idなので、エラーになる。同じ_idなら問題ありません。)
users.replaceOne(Filters.eq("_id", new ObjectId("5d859c77b64c3286a4d29d90")), user);

違う_idの場合は、userの_idフィールドを削除すればエラー解消できます。
Versionデータが有る場合は、replaceOneメソッドを使ってよいかもしれません。

// DBからデータ取得
Document user = users.find(Filters.eq("_id", new ObjectId("5d858b36c491de05900c4e32"))).first();
user.append("memo", "new user");
user.remove("_id");

#Delete

削除イメージ

image.png

##deleteOne
users.deleteOne(Filters.eq("_id", new ObjectId("5d859c77b64c3286a4d29d90")));

##deleteMany
users.deleteMany(Filters.eq("lastName", "鈴木"));

##削除関連メソッド
image.png

マニュアル: https://docs.mongodb.com/manual/
CRUD(本文のイメージ): https://docs.mongodb.com/manual/crud/

以上

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?