はじめに
この実験では、MongoDB データベースにデータを挿入するための基本的な技術を学びます。単一および複数のドキュメントの挿入、潜在的なエラーの処理、MongoDB シェル (mongosh) を使用したデータの整合性の検証を実践します。
この実験は、CRUD (Create, Read, Update, Delete) の「Create」操作に焦点を当てています。シンプルな書店データベースを一から構築し、NoSQL 環境における不可欠なデータ管理タスクの実践的な経験を積みます。最終的には、MongoDB でデータを効果的に追加および管理する方法について、確かな理解を得られるでしょう。
単一ドキュメントの挿入
最初のステップでは、MongoDB サーバーに接続し、データベースとコレクションを作成して、最初のドキュメントを挿入します。MongoDB は、柔軟な JSON ライクなドキュメントにデータを格納するため、複雑なデータ構造を簡単に表現できます。
まず、MongoDB シェルを使用してローカルの MongoDB インスタンスに接続します。ターミナルを開き、次のコマンドを実行します。
mongosh
> プロンプトが表示され、MongoDB シェルに入り、データベースに接続されたことが示されます。
次に、bookstore という名前の新しいデータベースに切り替えます。データベースが存在しない場合、MongoDB は最初にデータを格納したときに自動的に作成します。
use bookstore
出力は、bookstore データベースに切り替わったことを確認します。
switched to db bookstore
次に、books という名前の新しいコレクションに単一のドキュメントを挿入します。コレクションは MongoDB ドキュメントのグループであり、リレーショナルデータベースのテーブルにほぼ相当します。insertOne() メソッドは、コレクションに単一のドキュメントを追加します。
db.books.insertOne({
title: "The Great Gatsby",
author: "F. Scott Fitzgerald",
year: 1925,
genres: ["Classic", "Fiction"],
stock: 10
});
挿入が成功すると、MongoDB は操作を確認するドキュメントを返し、新しく挿入されたドキュメントの一意の _id を提供します。
{
acknowledged: true,
insertedId: ObjectId("652f8d3e111a2b3c4d5e6f78")
}
_id は、MongoDB がすべてのドキュメントに対して自動的に生成する一意の識別子であり、コレクション内の各ドキュメントが一意に識別されることを保証します。
複数ドキュメントの挿入
ドキュメントを一つずつ挿入するのは非効率的です。一度に複数のドキュメントを追加するために、MongoDB は insertMany() メソッドを提供しています。これはバルクインサート操作として知られており、データベースへのネットワーク往復回数を削減します。
このステップでは、単一のコマンドで books コレクションにさらに 3 冊の本を追加します。mongosh シェルにまだ接続しており、bookstore データベースに切り替わっていることを確認してください。
insertMany() メソッドを使用し、ドキュメントオブジェクトの配列を渡します。
db.books.insertMany([
{
title: "1984",
author: "George Orwell",
year: 1949,
genres: ["Dystopian", "Science Fiction"],
stock: 15
},
{
title: "To Kill a Mockingbird",
author: "Harper Lee",
year: 1960,
genres: ["Classic", "Fiction"],
stock: 5
},
{
title: "Pride and Prejudice",
author: "Jane Austen",
year: 1813,
genres: ["Romance", "Classic"],
stock: 12
}
]);
出力は、操作が認識されたことを確認し、挿入した 3 つのドキュメントそれぞれの _id 値を一覧表示します。
{
acknowledged: true,
insertedIds: {
'0': ObjectId("652f8e3e111a2b3c4d5e6f79"),
'1': ObjectId("652f8e3e111a2b3c4d5e6f7a"),
'2': ObjectId("652f8e3e111a2b3c4d5e6f7b")
}
}
ドキュメントが追加されたことを確認するには、コレクション内のドキュメントの総数をカウントできます。
db.books.countDocuments();
結果は 4 になるはずです。これは、前のステップの 1 つのドキュメントと、先ほど追加した 3 つのドキュメントを表します。
4
挿入データのクエリと検証
データを挿入した後、次に論理的なステップは、それを取得して調べることです。これは、データが正しく格納されたことを確認し、データベースから読み取るアプリケーションを構築するために不可欠です。MongoDB は、この目的のために強力な find() メソッドを提供しています。
books コレクション内のすべてのドキュメントを取得するには、引数なしで find() メソッドを使用します。
db.books.find();
このコマンドは、現在コレクション内にある 4 つのドキュメントすべてを一覧表示します。出力は長くなる可能性がありますが、すべてを一度に見るのに良い方法です。
より頻繁に、特定の条件に一致するドキュメントを見つけたい場合があります。1950 年より前に出版されたすべての書籍を見つけるには、$lt (より小さい) 演算子を使用したクエリフィルターを使用できます。
db.books.find({ year: { $lt: 1950 } });
このクエリは、「The Great Gatsby」、「1984」、「Pride and Prejudice」のドキュメントを返します。
場合によっては、ドキュメント全体ではなく、ドキュメントから特定のフィールドのみが必要になることがあります。これはプロジェクションと呼ばれます。「Classic」ジャンルのすべての書籍の title と author のみを取得するには、find() の 2 番目の引数としてプロジェクションドキュメントを追加できます。
db.books.find({ genres: "Classic" }, { title: 1, author: 1, _id: 0 });
プロジェクションドキュメントでは、1 は「このフィールドを含める」を意味し、0 は「このフィールドを除外する」を意味します。デフォルトでは、_id フィールドは常に含まれるため、_id: 0 で明示的に除外します。
出力は、タイトルと作者のきれいなリストになります。
[
{ "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
{ "title": "To Kill a Mockingbird", "author": "Harper Lee" },
{ "title": "Pride and Prejudice", "author": "Jane Austen" }
]
ユニークインデックスによる挿入エラーの処理
データ整合性は、あらゆるデータベースにとって不可欠です。それを強制する一つの方法は、重複エントリを防ぐことです。このステップでは、ユニークインデックスの作成方法と、MongoDB がこの制約違反の試みをどのように処理するかを学びます。
コレクション内のどの 2 冊の本も同じタイトルを持てないようにしましょう。これを行うには、title フィールドにユニークインデックスを作成します。
db.books.createIndex({ title: 1 }, { unique: true });
出力は、作成されたインデックスの名前を確認します。
title_1
ユニークインデックスが設定されたので、コレクションに既に存在するタイトル、「1984」を持つドキュメントを挿入してみましょう。
db.books.insertOne({
title: "1984",
author: "George Orwell",
year: 1949,
genres: ["Dystopian", "Science Fiction"],
stock: 20
});
この操作は失敗します。MongoDB は MongoBulkWriteException をエラーコード E11000 でスローします。これは重複キー違反を示します。これは期待される動作であり、ユニークインデックスが正しく機能していることを確認します。
MongoBulkWriteException: E11000 duplicate key error collection: bookstore.books index: title_1 dup key: { title: "1984" }
アプリケーションでは、プログラムをクラッシュさせるのではなく、このようなデータベース操作を try...catch ブロックで囲み、エラーを適切に処理します。これは mongosh シェルでもシミュレートできます。
try {
db.books.insertOne({
title: "1984",
author: "George Orwell"
});
} catch (e) {
print("Error inserting document:", e.message);
}
このコマンドは例外をキャッチし、ユーザーフレンドリーなエラーメッセージを出力して、潜在的な挿入失敗を処理するための堅牢な方法を示します。
スキーマバリデーションによるデータ整合性の強制
MongoDB は柔軟なスキーマで知られていますが、スキーマバリデーションを使用することで、ドキュメントに特定の構造を強制することができます。これにより、コレクション内のすべてのドキュメントが定義された一連のルールに従うようになり、データの品質と一貫性が向上します。
この最後のステップでは、books コレクションにバリデーターを追加します。このバリデーターは、各ドキュメントに title、author、year を必須とし、これらのフィールドに特定のデータ型と範囲を強制します。
collMod (コレクションの変更) コマンドを使用してバリデーターを追加します。
db.runCommand({
collMod: "books",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["title", "author", "year"],
properties: {
title: {
bsonType: "string",
description: "must be a string and is required"
},
author: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 1000,
maximum: 2024,
description: "must be an integer between 1000 and 2024"
}
}
}
}
});
出力 { ok: 1 } は、バリデーターが正常に適用されたことを確認します。
次に、ルールに違反するドキュメントを挿入しようとして、バリデーターをテストしましょう。このドキュメントは、許可された範囲外の year を持っています。
db.books.insertOne({
title: "The Hobbit",
author: "J.R.R. Tolkien",
year: 999
});
挿入は失敗し、MongoDB はドキュメントがバリデーションに失敗したことを説明するエラーメッセージを返します。
MongoBulkWriteException: Document failed validation
これにより、スキーマバリデーションルールがアクティブであり、データの整合性を効果的に保護していることが確認されます。この強力な機能は、NoSQL データベースの柔軟性とデータバリデーションの信頼性を組み合わせています。
まとめ
この実験では、MongoDB のコレクションにデータを挿入するためのコアテクニックを習得しました。まず insertOne() を使用して単一のドキュメントを挿入し、次に insertMany() のバルク操作を使用して効率的に複数のドキュメントを追加しました。
また、find() および countDocuments() を使用してデータをクエリおよび検証する方法も実践しました。最も重要なのは、データの整合性を確保するための 2 つの主要な方法を探求したことです。重複を防ぐためのユニークインデックスの作成と、一貫したドキュメント構造を強制するためのスキーマバリデーションの実装です。これらのスキルは、MongoDB で堅牢で信頼性の高いアプリケーションを構築するための基本となります。

