1. 序章

このチュートリアルでは、 BSON と、それを使用してMongoDBと対話する方法について説明します。

現在、MongoDBとそのすべての機能の詳細な説明は、この記事の範囲を超えています。 ただし、いくつかの重要な概念を理解しておくと役立ちます。

MongoDBは、分散型のNoSQLドキュメントストレージエンジンです。 ドキュメントはBSONデータとして保存され、コレクションにグループ化されます。 コレクション内のドキュメントは、リレーショナルデータベーステーブルの行に類似しています。

詳細については、MongoDBの紹介記事をご覧ください。

2. BSON とは何ですか?

BSONはBinaryJSONの略です。 これは、JSONのようなデータのバイナリシリアル化のためのプロトコルです。

JSONは、最新のWebサービスで人気のあるデータ交換形式です。 複雑なデータ構造を柔軟に表現する方法を提供します。

BSONには、通常のJSONを使用するよりもいくつかの利点があります。

  • コンパクト:ほとんどの場合、 BSON構造を保存するには、同等のJSONよりも必要なスペースが少なくて済みます。
  • データ型: BSONは、DateBinDataなど、通常のJSONにはない追加のデータ型を提供します。

BSONを使用する主な利点の1つは、トラバースが簡単なことです。 BSONドキュメントには、ドキュメント全体を読み取ることなく、ドキュメントのフィールドを簡単に操作できる追加のメタデータが含まれています。

3. MongoDBドライバー

BSONとMongoDBの基本を理解したところで、これらを一緒に使用する方法を見てみましょう。 CRUDの頭字語( C reate、 R ead、 U pdate、 D elete)の主なアクションに焦点を当てます。

MongoDBは、最新のプログラミング言語用のソフトウェアドライバーを提供します。 ドライバーはBSONライブラリの上に構築されます。つまり、クエリを構築するときにBSONAPIを直接操作します。 詳細については、MongoDBクエリ言語のガイドを参照してください。

このセクションでは、ドライバーを使用してクラスターに接続し、BSONAPIを使用してさまざまなタイプのクエリを実行する方法について説明します。 MongoDBドライバーは、よりコンパクトなコードを作成するのに役立つFiltersクラスを提供することに注意してください。 ただし、このチュートリアルでは、コアBSONAPIの使用のみに焦点を当てます。

MongoDBドライバーとBSONを直接使用する代わりに、 SpringDataMongoDBガイドをご覧ください。

3.1. 接続する

まず、MongoDBドライバーを依存関係としてアプリケーションに追加します。

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>3.10.1</version>
</dependency>

次に、MongoDBデータベースとコレクションへの接続を作成します。

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("myDB");
MongoCollection<Document> collection = database.getCollection("employees");

残りのセクションでは、コレクションリファレンスを使用したクエリの作成について説明します。

3.2. 入れる

employeesコレクションに新しいドキュメントとして挿入する次のJSONがあるとします。

{
  "first_name" : "Joe",
  "last_name" : "Smith",
  "title" : "Java Developer",
  "years_of_service" : 3,
  "skills" : ["java","spring","mongodb"],
  "manager" : {
     "first_name" : "Sally",
     "last_name" : "Johanson"
  }
}

この例のJSONは、MongoDBドキュメントで発生する最も一般的なデータ型(テキスト、数値、配列、埋め込みドキュメント)を示しています。

BSONを使用してこれを挿入するには、MongoDBの DocumentAPIを使用します。

Document employee = new Document()
    .append("first_name", "Joe")
    .append("last_name", "Smith")
    .append("title", "Java Developer")
    .append("years_of_service", 3)
    .append("skills", Arrays.asList("java", "spring", "mongodb"))
    .append("manager", new Document()
                           .append("first_name", "Sally")
                           .append("last_name", "Johanson"));
collection.insertOne(employee);

Document クラスは、BSONで使用されるプライマリAPIです。 これは、Java Map インターフェースを拡張し、いくつかのオーバーロードされたメソッドを含みます。 これにより、ネイティブタイプだけでなく、オブジェクトID、日付、リストなどの一般的なオブジェクトを簡単に操作できます。

3.3. 探す

MongoDBでドキュメントを検索するために、クエリするフィールドを指定する検索ドキュメントを提供しています。 たとえば、「Smith」という名前のすべてのドキュメントを検索するには、次のJSONドキュメントを使用します。

{  
  "last_name": "Smith"
}

BSONで書かれると、これは次のようになります。

Document query = new Document("last_name", "Smith");
List results = new ArrayList<>();
collection.find(query).into(results);

「検索」クエリは複数のフィールドを受け入れることができ、デフォルトの動作では、論理および演算子を使用してそれらを結合します。 これは、すべてのフィールドに一致するドキュメントのみが返されることを意味します

これを回避するために、MongoDBはまたはクエリ演算子を提供します。

{
  "$or": [
    { "first_name": "Joe" },
    { "last_name":"Smith" }
  ]
}

これにより、名が「Joe」または姓が「Smith」のすべてのドキュメントが検索されます。 これをBSONとして記述するには、上記の挿入クエリと同じように、ネストされたDocumentを使用します。

Document query = 
  new Document("$or", Arrays.asList(
      new Document("last_name", "Smith"),
      new Document("first_name", "Joe")));
List results = new ArrayList<>();
collection.find(query).into(results);

3.4. アップデート

更新クエリは2つのドキュメントを必要とするため、MongoDBでは少し異なります

  1. 1つ以上のドキュメントを検索するためのフィルター基準
  2. 変更するフィールドを指定する更新ドキュメント

たとえば、すでに「春」のスキルを持っているすべての従業員に「セキュリティ」スキルを追加したいとします。 最初のドキュメントは「春」のスキルを持つすべての従業員を検索し、2番目のドキュメントはスキル配列に新しい「セキュリティ」エントリを追加します。

JSONでは、これら2つのクエリは次のようになります。

{
  "skills": { 
    $elemMatch:  { 
      "$eq": "spring"
    }
  }
}

{
  "$push": { 
    "skills": "security"
  }
}

そしてBSONでは、次のようになります。

Document query = new Document(
  "skills",
  new Document(
    "$elemMatch",
    new Document("$eq", "spring")));
Document update = new Document(
  "$push",
  new Document("skills", "security"));
collection.updateMany(query, update);

3.5. 消去

MongoDBでのクエリの削除は、クエリの検索と同じ構文を使用します。一致する1つ以上の基準を指定するドキュメントを提供するだけです。

たとえば、従業員データベースにバグが見つかり、長年のサービスで負の値を持つ従業員を誤って作成したとします。 それらすべてを見つけるには、次のJSONを使用します。

{
  "years_of_service" : { 
    "$lt" : 0
  }
}

同等のBSONドキュメントは次のようになります。

Document query = new Document(
  "years_of_service", 
  new Document("$lt", 0));
collection.deleteMany(query);

4. 結論

このチュートリアルでは、BSONライブラリを使用してMongoDBクエリを構築するための基本的な概要を説明しました。 BSON APIのみを使用して、MongoDBコレクションの基本的なCRUD操作を実装しました。

まだ取り上げていないのは、予測、集計、地理空間クエリ、一括操作などのより高度なトピックです。 これらはすべて、BSONライブラリのみを使用して可能です。 ここで見た例は、これらのより高度な操作を実装するために使用するビルディングブロックを形成します。

いつものように、上記のコード例はGitHubリポジトリにあります。