blog

Spring Boot 2.X 実践編 -- Spring BootとMongoDBの連携

データ量がますます急増する今日、閲覧やクリックの記録、商品の購入記録など、ユーザーの個人情報は増加し、伝統的なSQLデータベースではこれらのデータを保存して処理するには十分ではなく、より多くのアプリケ...

Dec 12, 2020 · 7 min. read
シェア

ソースコードリポジトリ

データ量がますます急増する今日、閲覧やクリックの記録、商品の購入記録など、ユーザーの個人情報は増加の一途をたどっており、従来のSQLデータベースではこれらのデータをうまく保存・処理できなくなったため、NoSQLを使用してメガスケールのデータセットを保存するアプリケーションが増加しています。ますます多くのアプリケーションがNoSQLを使用して非常に大きなデータセットを保存しています。 NoSQLデータは固定フォーマットなしで保存できるため、より簡単に拡張できます。

MongoDBは、クエリやインデックスを簡単に作成できる柔軟性に優れた分散型ドキュメントデータベースで、スケーラビリティを提供する高性能なデータストレージソリューションです。非リレーショナルデータベースの中で最もリッチでリレーショナルデータベース的なNoSQLです。

このサブセクションでは、SpringBootとMongoDBの統合とMongoDBの操作に焦点を当てます。

MongoDBの導入とインストール

MongoDBはC++で書かれたオープンソースのドキュメントデータベースで、アプリケーション開発とデータベース拡張を容易にするように設計されています。JSONライクなドキュメントでデータを保存します。

MongoDBでは、配列やネストされたオブジェクトを値としてサポートし、データを格納するキー--バリュー方式が、最も効率的で自然なデータの扱い方を提供する、と公式発表されています。

MongoDBは強力なクエリメソッドをサポートしており、簡単に任意のフィールドを並べ替えたり、フィルタリングすることができます。

完全なACIDトランザクションをサポートする、最もリレーショナルデータベース的なNoSQL。

ドキュメントデータベース

MongoDB はドキュメントを記録します。ドキュメントとは、JSON オブジェクトに似た、キーと値で構成されるペアのデータ構造です。

  • JSONライクなドキュメント・オブジェクトは複数のプログラミング言語をサポート
  • 埋め込みサポートにより、SQLに必要なフィールド結合を削減
  • 動的拡張のサポート

MongoDB の主な機能

  • より高いパフォーマンス
  • リッチクエリ言語
  • 高可用性
  • 水平スケーラビリティ

MongoDBのパスワード認証を解除したら、接続できるようになりました。

MongoDB Community Editionのダウンロードリンク:.., お使いのシステムに対応するバイナリインストーラを選択してください。

特に、インストール中に「Install MongoDB Compass」にチェックを入れないでください。

テスト:

# サービスを開いたら、ターミナルで以下のコマンドを実行する。> mongo
# テスト用データベースを使い、データベースがなければ作成し、データベースを表示して、すでにあるデータベースを確認する。
use test
# SQLのテーブルのようなコレクションを作成し、コレクションを表示する。
db.createCollection("springboot");
# Springbootコレクションにデータを挿入する
db.springboot.insertOne( { name: "Spring Boot With MongoDB" });
# すべてのDBを検索する.getCollection("springboot") dbに相当する.springboot
db.getCollection("springboot").find()
# クエリー条件によると
db.getCollection("springboot").find({name:"Spring Boot With MongoDB"});
# レコードを削除する
db.springboot.remove( { name: "Spring Boot With MongoDB" });
# コレクションを削除する
db.springboot.drop()
# 現在のデータベースを削除する
db.dropDatabase()

MongoDBのパスワード認証を解除したら接続できるようになりました。

application.propertiesファイルに、MongoDBのデータベースURIを追加します。

# アドレス、ポート番号、データベース
spring.data.mongodb.uri=mongodb://.1:27017/boot

プロジェクトの起動 エントリクラス アプリケーションの追加 @EnableMongoRepositories アセンブリ MongoDB リポジトリ

@SpringBootApplication
@EnableMongoRepositories
public class MongoApplication {}

新しいUser.javaエンティティクラス

public class User {
 // もし@Id ちなみに、挿入時には自動的に_id キー値として
 @Id
 private Integer id;
 private String username;
 private String nickname;
 // ゲッターsettertoStringを省略する,
}
@Repository
public interface UserRepository extends MongoRepository<User, Integer> {
	// username パラメータが入力されたすべてのドキュメント
 List<User> findByUsernameContains(String username);
 // nickname パラメータが入力されたすべてのドキュメント
 List<User> findByNicknameContaining(String nickname);
 // id 入力された値と同じレコードが複数ある場合は、最初のレコードが返される。
 User findByIdIs(Integer id);
 // カスタムクエリ、構文はMongoDBクエリ言語、ニックネームはパラメータとして渡されたすべてのドキュメントを含む。
 @Query("{nickname:{$regex:?0}}}")
 List<User> mySelect(String nickname);
}
@ExtendWith(SpringExtension.class)
@SpringBootTest
class UserRepositoryTest {
 @Resource MongoTemplate mongoTemplate;
 @Resource UserRepository userRepository;
}

ドキュメントの挿入

@Test
public void insert() {
 User user = new User();
 user.setId(1);
 user.setUsername("MongoDB");
 user.setNickname("オープンソース、クロスプラットフォーム、ドキュメント指向のデータベース」)。;
 userRepository.insert(user);
 // MongoTemplateを使う
 user.setId(2);
 user.setUsername("Redis");
 user.setNickname("インメモリデータ構造ストレージシステム");
 mongoTemplate.insert(user);
}

User.java は @Id キー値を宣言しているので、挿入時には手動で setId(1) を指定する必要があります。挿入やクエリなどの際には、MongoDB は Java のエンティティクラスそのものを元にしたコレクションを使います。これは Spring Data JPA の @Entity アノテーションがついたエンティティクラスと似ています。

Ideaでは、Shift+Ctrl+F10でこのテストメソッドを実行します。

MongoDBのパスワード認証を解除したら接続できるようになりました。

@Test
public void select() {
 System.out.println("すべてのレコードを照会する");
 //  
 System.out.println(userRepository.findAll());
 //  
 System.out.println(mongoTemplate.findAll(User.class));
 // JPAメソッド名の命名規則に従って、レコードをクエリする。
 System.out.println("条件に基づいてuserRepositoryに照会る");
 System.out.println(userRepository.findByUsernameContains("go"));
 System.out.println(userRepository.findByNicknameContaining("メモリ"));
 // userRepositoryのカスタムクエリ文は、MongoDBのクエリメソッドを使う。
 System.out.println(userRepository.mySelect("ストレージシステム"));
 // mongoTemplateを使う
 System.out.println("条件に基づいてmongoTemplateに照会る");
 // id = 2
 System.out.println(mongoTemplate.findById(2, User.class));
 // SQLのwhere idに相当する。= 1 and username like %DB%
 Query query = new Query(Criteria.where("id").is(1).and("username").regex("DB"));
 System.out.println(mongoTemplate.find(query, User.class));
}

MongoDBのパスワード認証を解除すれば接続できるようになります。

@Test
public void update() {
 // userRepositoryを使って更新する
 User user = userRepository.findByIdIs(2);
 // ニックネームを更新する
 user.setNickname("Redis オープンソース非リレーショナルデータベース");
 // save insertと似ているが、saveはID値が存在する場合は更新し、まだ存在しない場合は挿入するという違いがある。
 userRepository.save(user);
 System.out.println("userRepository データ更新結果");
 System.out.println(userRepository.findByIdIs(2));
 // mongoTemplateを使う
 Query query = new Query(Criteria.where("id").is(1));
 Update update = new Update();
 update.set("nickname", "MongoDB 人気文書データベースの更新:By mongoTemplate");
 mongoTemplate.updateFirst(query, update, User.class);
 System.out.println("mongoTemplate データ更新結果");
 System.out.println(mongoTemplate.findById(1, User.class));
}

MongoDBのパスワード認証を解除したら、接続できるようになりました。

@Test
public void delete() {
 // userRepositoryを使う
 userRepository.deleteById(1);
 // mongoTemplateを使う
 Query query = new Query(Criteria.where("id").is(1));
 // 条件に合うものを探して削除する。
 mongoTemplate.findAndRemove(query, User.class);
 // ユーザーコレクションの全レコードを削除する
 userRepository.deleteAll();
 // ユーザーコレクションの全レコードを削除する
 mongoTemplate.remove(User.class);
}

ここでSpringBootの統合MongoDBは、SpringBootのStarterのパワーに驚嘆しなければならない、自動化の様々な構成の多くは、開発者だけが対応するビジネスロジックに集中する必要がありますすることができます。

落とし穴を踏む

MongoDBのバージョンは4.Xなので、MongoDBでユーザー認証とパスワード認証が有効になっている場合、以下の設定で接続すると以下のエラーが発生します:

Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1....

IdeaのDataToolsに接続する方法をいろいろ探しましたが、接続できません。最終的に、Spring Data MongoDBがバージョン3.Xのドライバを使っていることがわかりました。最終的に、Spring Data MongoDBが使っているドライバはバージョン3.Xで、互換性がないためか、MongoDBのパスワード認証を解除したら、接続できるようになりました。

Read next

CSS知識の要約

1。一般的な知識とツールのウェブサイト2。ボックスモデル 標準のボックスモデルのコンテンツボックスでは、幅と高さは、コンテンツ領域の幅と高さを参照してください。内側の余白、境界線、外側の余白を追加しても、コンテンツ領域のサイズには影響しませんが、要素ボックスの合計サイズが大きくなります。 IEボックスモデルのボーダーボックスでは、幅と高さは...

Dec 11, 2020 · 3 min read