1。はじめに
このチュートリアルでは、BSONと、それを使用してMongoDBと対話する方法について説明します。
現在、MongoDBとそのすべての機能の詳細な説明は、この記事の範囲を超えています。ただし、いくつかの重要な概念を理解しておくと役立ちます。
MongoDBは、分散型のNoSQLドキュメントストレージエンジンです。ドキュメントはBSONデータとして保存され、コレクションにグループ化されます。 コレクション内のドキュメントは、リレーショナルデータベーステーブルの行に類似しています 。
詳細については、MongoDBの紹介記事をご覧ください。
2。 BSONとは ?
BSONはBinaryJSONの略です 。これは、JSONのようなデータのバイナリシリアル化のためのプロトコルです。
JSONは、最新のWebサービスで人気のあるデータ交換形式です。複雑なデータ構造を柔軟に表現する方法を提供します。
BSONには、通常のJSONを使用するよりもいくつかの利点があります。
- コンパクト:ほとんどの場合、 BSON構造を保存するために必要なスペースは、同等のJSONよりも少なくなります
- データ型:BSONは追加のデータ型を提供します Dateなどの通常のJSONにはありません およびBinData
BSONを使用する主な利点の1つは、トラバースが簡単なことです 。 BSONドキュメントには、ドキュメント全体を読み取ることなく、ドキュメントのフィールドを簡単に操作できる追加のメタデータが含まれています。
3。 MongoDBドライバー
BSONとMongoDBの基本を理解したところで、これらを一緒に使用する方法を見てみましょう。 CRUDの頭字語( C )の主なアクションに焦点を当てます reate、 R ead、 U pdate、 D elete)。
MongoDBは、ほとんどの最新のプログラミング言語用のソフトウェアドライバーを提供します。 ドライバーはBSONライブラリの上に構築されています 、つまり、クエリを作成するときにBSONAPIを直接使用します。詳細については、MongoDBクエリ言語のガイドをご覧ください。
このセクションでは、ドライバーを使用してクラスターに接続し、BSONAPIを使用してさまざまなタイプのクエリを実行する方法について説明します。 MongoDBドライバーはフィルターを提供することに注意してください よりコンパクトなコードを書くのに役立つクラス。ただし、このチュートリアルでは、コア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。挿入
従業員に新しいドキュメントとして挿入したい次の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のドキュメントを使用します。 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);
ドキュメント クラスはBSONで使用されるプライマリAPIです。 Javaのマップを拡張します インターフェイスであり、いくつかのオーバーロードされたメソッドが含まれています。これにより、ネイティブタイプだけでなく、オブジェクト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 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つ以上のドキュメントを検索するためのフィルター基準
- 変更するフィールドを指定する更新ドキュメント
たとえば、すでに「春」のスキルを持っているすべての従業員に「セキュリティ」スキルを追加したいとします。最初のドキュメントは「春」のスキルを持つすべての従業員を検索し、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);