MongoDB BSONガイド

1. 前書き

このチュートリアルでは、http://bsonspec.org/ [BSON]と、それを使用してhttps://www.mongodb.com/[MongoDB]とやり取りする方法について説明します。
さて、MongoDBとそのすべての機能の詳細な説明は、この記事の範囲外です。 ただし、いくつかの重要な概念を理解しておくと役立ちます。
MongoDBは、分散型のNoSQLドキュメントストレージエンジンです。 ドキュメントはBSONデータとして保存され、コレクションにグループ化されます。 *コレクション内のドキュメントは、リレーショナルデータベーステーブル内の行に似ています*。
詳細については、https://www.baeldung.com/java-mongodb [MongoDBの紹介記事]をご覧ください。

2. BSONとは何ですか?

  • BSONは_Binary JSON_ *を表します。 JSONのようなデータのバイナリシリアル化のためのプロトコルです。

    JSONは、最新のWebサービスで一般的なデータ交換形式です。 複雑なデータ構造を表現する柔軟な方法を提供します。
    BSONは、通常のJSONを使用するよりもいくつかの利点があります。
  • コンパクト:ほとんどの場合、* BSON構造を保存するために必要なスペースは少なくなります
    同等のJSONより*

  • データ型:* BSONは、通常のデータ型にはない追加のデータ型を提供します*
    _Date_や_BinData_などのJSON

  • BSONを使用する主な利点の1つは、移動しやすいことです*。 BSONドキュメントには、ドキュメント全体を読む必要なく、ドキュメントのフィールドを簡単に操作できる追加のメタデータが含まれています。

3. MongoDBドライバー

BSONとMongoDBの基本的な理解ができたので、これらを一緒に使用する方法を見てみましょう。 CRUDの頭字語(** C ** reate、** R ** ead、** U ** pdate、** D ** elete)からの主なアクションに焦点を当てます。
MongoDBは、最新のプログラミング言語のほとんどにhttps://docs.mongodb.com/ecosystem/drivers/ [ソフトウェアドライバー]を提供しています。 *ドライバーはBSONライブラリーの上に構築されます*。これは、クエリを構築するときにBSON APIを直接操作することを意味します。 詳細については、https://www.baeldung.com/queries-in-spring-data-mongodb [MongoDBクエリ言語ガイド]を参照してください。
このセクションでは、ドライバーを使用してクラスターに接続し、BSON APIを使用してさまざまな種類のクエリを実行する方法について説明します。 MongoDBドライバーはhttps://mongodb.github.io/mongo-java-driver/3.10/javadoc/?com/mongodb/client/model/Filters.html[_Filters_ class]を提供するので、よりコンパクトに書くことができます。コード。 ただし、このチュートリアルでは、コアBSON APIの使用のみに焦点を当てます。
MongoDBドライバーとBSONを直接使用する代わりに、https://www.baeldung.com/spring-data-mongodb-guide [Spring Data MongoDBガイド]をご覧ください。

3.1. 接続中

開始するには、まずhttps://search.maven.org/search?q=g:org.mongodb%20AND%20a:mongodb-driver-sync[MongoDB driver]をアプリケーションに依存関係として追加します。
<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");
残りのセクションでは、_collection_参照を使用したクエリの作成について説明します。

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の_Document_ APIを使用します。
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だけでなく、オブジェクトID、日付、リストなどの一般的なオブジェクトを簡単に操作できます。

3.3. Find

MongoDBでドキュメントを見つけるために、クエリするフィールドを指定する検索ドキュメントを提供します。 たとえば、姓が「Smith」であるすべてのドキュメントを検索するには、次のJSONドキュメントを使用します。
{
  "last_name": "Smith"
}
BSONで書かれたものは次のようになります。
Document query = new Document("last_name", "Smith");
List results = new ArrayList<>();
collection.find(query).into(results);
「検索」クエリは複数のフィールドを受け入れることができ、デフォルトの動作では論理_and_演算子を使用してそれらを結合します。 *これは、すべてのフィールドに一致するドキュメントのみが返されることを意味します*。
これを回避するために、MongoDBには_or_クエリ演算子が用意されています。
{
  "$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. 更新

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

    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つ以上の条件を指定するドキュメントを提供するだけです。

    たとえば、従業員データベースにバグを発見し、誤って従業員aを作成して、勤続年数に対してマイナスの値を設定したとします。 それらをすべて見つけるには、次の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ライブラリのみを使用して可能です。 ここで見た例は、これらのより高度な操作を実装するために使用するビルディングブロックを形成します。
いつものように、https://github.com/eugenp/tutorials/tree/master/persistence-modules/java-mongodb [GitHub repo]で上記のコード例を見つけることができます。