LoginSignup
8
9

More than 3 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