Help us understand the problem. What is going on with this article?

MongoDB基礎:JAVAでCRUDから入門

はじめに

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

条件と一致するデータを更新したい場合はinsertManyメソッドを使います。
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/

以上

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away