1. 概要

この記事では、非常に人気のあるNoSQLオープンソースデータベースであるMongoDBをスタンドアロンのJavaクライアントと統合する方法について説明します。

MongoDBはC++で記述されており、map-reduce、自動シャーディング、レプリケーション、高可用性など、非常に多くの確かな機能を備えています。

2. MongoDB

MongoDB自体に関するいくつかの重要なポイントから始めましょう。

  • さまざまな構造を持つことができるJSONのようなドキュメントにデータを格納します
  • 動的スキーマを使用します。つまり、事前に定義しなくてもレコードを作成できます。
  • レコードの構造は、新しいフィールドを追加したり、既存のフィールドを削除したりするだけで変更できます。

上記のデータモデルにより、階層関係を表現したり、配列やその他のより複雑な構造を簡単に格納したりすることができます。

3. 用語

リレーショナルデータベース構造と比較できれば、MongoDBの概念を理解しやすくなります。

Mongoと従来のMySQLシステムの類似点を見てみましょう。

  • MySQLのTableはMongoのCollectionになります
  • ドキュメントになります
  • フィールドになります
  • 結合は、リンクおよび埋め込みドキュメントとして定義されます

これはもちろん、MongoDBのコア概念を調べるための単純な方法ですが、それでも便利です。

それでは、この強力なデータベースを理解するために、実装について詳しく見ていきましょう。

4. Mavenの依存関係

まず、MongoDBのJavaドライバーの依存関係を定義する必要があります。

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.4.1</version>
</dependency>

ライブラリの新しいバージョンがリリースされているかどうかを確認するには–ここでリリースを追跡します

5. MongoDBを使用する

それでは、Javaを使用してMongoクエリの実装を開始しましょう。 最初に最適な基本的なCRUD操作について説明します。

5.1. MongoClientと接続する

まず、MongoDBサーバーに接続しましょう。 バージョン>=2.10.0では、MongoClientを使用します。

MongoClient mongoClient = new MongoClient("localhost", 27017);

また、古いバージョンの場合は、Mongoクラスを使用してください。

Mongo mongo = new Mongo("localhost", 27017);

5.2. データベースへの接続

それでは、データベースに接続しましょう。 作成する必要がないことに注意してください。 Mongoは、データベースが存在しないことを確認すると、データベースを作成します。

DB database = mongoClient.getDB("myMongoDb");

場合によっては、デフォルトで、MongoDBは認証済みモードで実行されます。 その場合、データベースへの接続中に認証する必要があります。

以下に示すようにそれを行うことができます:

MongoClient mongoClient = new MongoClient();
DB database = mongoClient.getDB("myMongoDb");
boolean auth = database.authenticate("username", "pwd".toCharArray());

5.3. 既存のデータベースを表示する

既存のすべてのデータベースを表示してみましょう。 コマンドラインを使用する場合、データベースを表示する構文はMySQLに似ています。

show databases;

Javaでは、以下のスニペットを使用してデータベースを表示します。

mongoClient.getDatabaseNames().forEach(System.out::println);

出力は次のようになります。

local      0.000GB
myMongoDb  0.000GB

上記では、localがデフォルトのMongoデータベースです。

5.4. コレクションを作成します

まず、データベース用の Collection (MongoDBに相当するテーブル)を作成することから始めましょう。 データベースに接続したら、コレクションを次のように作成できます。

database.createCollection("customers", null);

次に、現在のデータベースの既存のすべてのコレクションを表示しましょう。

database.getCollectionNames().forEach(System.out::println);

出力は次のようになります。

customers

5.5. 保存–挿入

save 操作には、保存または更新のセマンティクスがあります。 id が存在する場合は、 update を実行し、存在しない場合は、insertを実行します。

新規顧客を保存すると、次のようになります。

DBCollection collection = database.getCollection("customers");
BasicDBObject document = new BasicDBObject();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insert(document);

エンティティはデータベースに挿入されます。

{
    "_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
    "name" : "Shubham",
    "company" : "Baeldung"
}

次に、同じ操作– save –をupdateセマンティクスで見ていきます。

5.6. 保存–更新

次に、既存の顧客で動作するupdateセマンティクスを使用したsaveを見てみましょう。

{
    "_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
    "name" : "Shubham",
    "company" : "Baeldung"
}

ここで、既存の顧客を保存すると、更新されます。

BasicDBObject query = new BasicDBObject();
query.put("name", "Shubham");

BasicDBObject newDocument = new BasicDBObject();
newDocument.put("name", "John");

BasicDBObject updateObject = new BasicDBObject();
updateObject.put("$set", newDocument);

collection.update(query, updateObject);

データベースは次のようになります。

{
    "_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
    "name" : "John",
    "company" : "Baeldung"
}

ご覧のとおり、この特定の例では、saveupdateのセマンティクスを使用しています。これは、指定された_idのオブジェクトを使用しているためです。

5.7. コレクションからドキュメントを読み取ります

クエリを実行して、コレクションドキュメントを検索してみましょう。

BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("name", "John");
DBCursor cursor = collection.find(searchQuery);

while (cursor.hasNext()) {
    System.out.println(cursor.next());
}

コレクションに現在あるドキュメントのみが表示されます。

[
    {
      "_id" : ObjectId("33a52bb7830b8c9b233b4fe6"),
      "name" : "John",
      "company" : "Baeldung"
    }
]

5.8. 削除ドキュメント

最後のCRUD操作である削除に進みましょう。

BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("name", "John");

collection.remove(searchQuery);

上記のコマンドを実行すると、ドキュメントのみがコレクションから削除されます。

6. 結論

この記事は、JavaからMongoDBを使用するための簡単な紹介でした。

これらすべての例とコードスニペットの実装は、GitHub にあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。