MongoDB CRUD操作の習得:実践的なコマンドガイド
MongoDBは、その柔軟性、スケーラビリティ、パフォーマンスにより、数多くの最新アプリケーションの基盤を形成する、人気のNoSQLドキュメントデータベースです。あらゆるデータベースとの対話の中心には、基本的な作成(Create)、読み取り(Read)、更新(Update)、削除(Delete)のCRUD操作があります。これらのコマンドを習得することは、新しい機能を構築する開発者からデータを管理する管理者まで、MongoDBを扱うすべての人にとって不可欠です。
この包括的なガイドでは、CRUD操作を実行するためのコアなMongoDBコマンドについて解説します。insert、find、update、deleteコマンドを、実践的でわかりやすい例とともに網羅し、データを効率的に管理するための知識を提供します。この記事の終わりまでに、MongoDBコレクションと効果的かつ自信を持ってやり取りする方法についての確かな理解が得られるでしょう。
前提条件
コマンドに入る前に、以下のものが揃っていることを確認してください。
- MongoDBのインストールと実行: 公式のMongoDBウェブサイトからダウンロードするか、MongoDB Atlasなどのクラウドサービスを利用できます。
mongosh(MongoDB Shell)のインストール: これはMongoDB用の対話型JavaScriptインターフェースです。
MongoDBへの接続とデータベースの選択
まず、ターミナルまたはコマンドプロンプトを開き、mongoshを使用してMongoDBインスタンスに接続します。
mongosh
接続すると、デフォルトのtestデータベース内にいます。別のデータベースに切り替えるか、新しいデータベースを作成するには、useコマンドを使用します。
use myDatabase;
myDatabaseが存在しない場合、そのコレクション内に最初のドキュメントを挿入したときにMongoDBによって暗黙的に作成されます。
作成操作(Insert)
作成操作には、新しいドキュメントをコレクションに追加することが含まれます。MongoDBは、単一または複数のドキュメントを挿入するためのメソッドを提供します。
1. db.collection.insertOne()
このメソッドは、単一のドキュメントをコレクションに挿入します。コレクションが存在しない場合、MongoDBがそれを作成します。
// 'users'という名前のコレクションを選択
db.users.insertOne({
name: "Alice Smith",
age: 30,
city: "New York",
email: "[email protected]",
interests: ["reading", "hiking"]
});
出力には、acknowledgedステータスと新しいドキュメントのinsertedIdが表示されます。
2. db.collection.insertMany()
このメソッドを使用して、単一の操作で複数のドキュメントをコレクションに挿入します。これはドキュメントの配列を受け取ります。
db.users.insertMany([
{
name: "Bob Johnson",
age: 24,
city: "Los Angeles",
email: "[email protected]",
interests: ["coding", "gaming"]
},
{
name: "Charlie Brown",
age: 35,
city: "New York",
email: "[email protected]",
interests: ["cooking", "photography"]
},
{
name: "Diana Prince",
age: 29,
city: "London",
email: "[email protected]",
interests: ["fitness", "travel"]
}
]);
これにより、追加されたすべてのドキュメントのinsertedIdsの配列が返されます。
ヒント:
_idフィールドを指定しない場合、MongoDBは各ドキュメントに_idフィールド(一意のObjectId)を自動的に追加します。
読み取り操作(Find)
読み取り操作には、コレクションからドキュメントを照会することが含まれます。find()メソッドがこのための主要なツールです。
1. db.collection.find()
a. すべてのドキュメントの検索
コレクション内のすべてのドキュメントを取得するには、引数なしでfind()を呼び出します。
db.users.find();
b. クエリフィルターを使用したドキュメントの検索
クエリドキュメントをfind()に渡して、ドキュメントを選択するための基準を指定します。これはSQLのWHERE句のように機能します。
// ニューヨーク在住のユーザーを検索
db.users.find({ city: "New York" });
// 25歳より年上のユーザーを検索
db.users.find({ age: { $gt: 25 } });
// 25歳から35歳までのユーザーを検索(35歳は含まない)
db.users.find({ age: { $gt: 25, $lt: 35 } });
// 関心事に'coding'が含まれるユーザーを検索
db.users.find({ interests: "coding" });
// 関心事に'reading'と'hiking'の**両方**が含まれるユーザーを検索
db.users.find({ interests: { $all: ["reading", "hiking"] } });
// Alice Smithという名前、またはロンドン在住のユーザーを検索
db.users.find({
$or: [
{ name: "Alice Smith" },
{ city: "London" }
]
});
一般的なクエリ演算子:
* $eq: 等しい(オペレータが指定されていない場合のデフォルト)
* $ne: 等しくない
* $gt: より大きい
* $gte: 以上
* $lt: より小さい
* $lte: 以下
* $in: 配列で指定された値のいずれかに一致する
* $nin: 配列で指定された値のいずれにも一致しない
* $and, $or, $not, $nor: 論理演算子
c. プロジェクション:特定のフィールドの選択
フィールドのサブセットのみを返すには、find()の2番目の引数としてプロジェクションドキュメントを渡します。値が1はフィールドを含め、0は除外します。_idフィールドは、明示的に除外しない限りデフォルトで含まれます。
// 名前とメールアドレスのみを返し、_idは除外
db.users.find({ city: "New York" }, { name: 1, email: 1, _id: 0 });
d. ソート、制限、スキップ
メソッドを連鎖させることで、より複雑なクエリが可能になります。
// 年齢で降順にソート(1は昇順、-1は降順)
db.users.find().sort({ age: -1 });
// 結果を2ドキュメントに制限
db.users.find().limit(2);
// 最初の2ドキュメントをスキップして残りを返す
db.users.find().skip(2);
// 操作の組み合わせ:ニューヨーク在住のユーザーを検索し、年齢で昇順ソート、1件スキップ、1件制限
db.users.find({ city: "New York" }).sort({ age: 1 }).skip(1).limit(1);
2. db.collection.findOne()
このメソッドは、クエリ条件に一致する単一のドキュメントを返します。複数のドキュメントが一致する場合、最初に見つかったドキュメントを返します。
db.users.findOne({ name: "Alice Smith" });
更新操作
更新操作は、コレクション内の既存のドキュメントを変更します。単一のドキュメント、複数のドキュメントを更新したり、ドキュメント全体を置き換えたりすることもできます。
1. db.collection.updateOne()
フィルター条件に一致する単一のドキュメントを更新します。
// Aliceの都市を'San Francisco'に更新
db.users.updateOne(
{ name: "Alice Smith" },
{ $set: { city: "San Francisco", lastUpdated: new Date() } }
);
2. db.collection.updateMany()
フィルター条件に一致するすべてのドキュメントを更新します。
// ニューヨーク在住の全ユーザーの年齢を1増やす
db.users.updateMany(
{ city: "New York" },
{ $inc: { age: 1 } }
);
// すでに持っていないユーザーに関心事として'reading'を追加
db.users.updateMany(
{}, // すべてのドキュメントに適用
{ $addToSet: { interests: "reading" } }
);
// Bob Johnsonの関心事から'gaming'を削除
db.users.updateOne(
{ name: "Bob Johnson" },
{ $pull: { interests: "gaming" } }
);
一般的な更新演算子:
* $set: ドキュメント内のフィールドの値を設定します。フィールドが存在しない場合は作成されます。
* $inc: フィールドの値を指定された量だけ増やします。
* $unset: ドキュメントからフィールドを削除します。
* $push: 配列フィールドに値を追加します。
* $pull: 指定されたクエリと一致する配列内のすべてのインスタンスを削除します。
* $addToSet: 値がまだ存在しない場合にのみ配列に値を追加します。
3. db.collection.replaceOne()
フィルター条件に一致する単一のドキュメントを新しいドキュメントと完全に置き換えます。置き換えられるドキュメントの_idフィールドは変更できません。
// Bob Johnsonのドキュメント全体を置き換え
db.users.replaceOne(
{ name: "Bob Johnson" },
{
name: "Robert Johnson",
occupation: "Software Engineer",
status: "active",
email: "[email protected]"
}
);
Upsertオプション
updateOne()とupdateMany()の両方がupsertオプションをサポートしています。これをtrueに設定し、フィルターに一致するドキュメントがない場合、MongoDBはクエリと更新操作に基づいて新しいドキュメントを挿入します。
db.users.updateOne(
{ name: "David Lee" },
{ $set: { age: 28, city: "Seattle" } },
{ upsert: true } // David Leeが存在しない場合は作成する
);
削除操作
削除操作は、コレクションからドキュメントを削除します。削除操作は元に戻せないため、これらの操作には細心の注意を払ってください。
1. db.collection.deleteOne()
指定されたフィルターに一致するドキュメントを最大1つ削除します。
// 'Robert Johnson'という名前のユーザーを削除(以前の'Bob Johnson')
db.users.deleteOne({ name: "Robert Johnson" });
2. db.collection.deleteMany()
指定されたフィルターに一致するすべてのドキュメントを削除します。
// ロンドン在住の全ユーザーを削除
db.users.deleteMany({ city: "London" });
警告: コレクション内のすべてのドキュメントを削除するには、空のフィルター
{}を使用します。この操作は元に戻せないため、細心の注意を払ってください。
javascript db.users.deleteMany({}); // 'users'コレクション内のすべてのドキュメントを削除
3. db.collection.drop()
このメソッドは、データベースからコレクション全体(すべてのドキュメントとインデックスを含む)を永久に削除します。
db.users.drop(); // 'users'コレクション全体を削除
警告: コレクションの削除は非常に破壊的な操作です。このコマンドを実行する前に、適切なバックアップがあること、または完全に確信があることを確認してください。
MongoDB CRUDのベストプラクティス
- インデックス作成: 頻繁に照会されるフィールドにはインデックスを作成し、読み取り操作を大幅に高速化します。
db.collection.createIndex({ fieldName: 1 })。 - プロジェクション: 必要なデータのみを取得します。プロジェクション(
{ field: 1 })を使用すると、ネットワーク帯域幅とメモリ使用量が削減されます。 - バッチ操作: 多数のドキュメントの挿入、更新、または削除を行う場合は、個別の操作ではなく
insertMany()、updateMany()、deleteMany()を使用してオーバーヘッドを削減します。 - 演算子の理解: MongoDBの豊富なクエリおよび更新演算子のセットに習熟してください。これらはデータを操作するための強力な方法を提供します。
- エラー処理: 本番環境のアプリケーションでは、データベース操作に対して常に堅牢なエラー処理を実装してください。
- スキーマ設計: MongoDBはスキーマレスですが、効率的なクエリとデータ整合性のために、思慮深いスキーマ設計が不可欠です。
結論
MongoDBのCRUD操作を習得することは、効果的なデータ管理とアプリケーション開発の基本です。このガイドでは、例とベストプラクティスを交えながら、不可欠なinsert、find、update、deleteコマンドの実践的なウォークスルーを提供しました。
ドキュメントの作成、読み取り、更新、削除の方法を理解することで、MongoDBデータベースと効率的にやり取りするためのコアスキルを習得しました。これらのコマンドの練習を続け、アグリゲーションパイプライン、トランザクション、インデックス作成戦略などの高度な機能を探索して、MongoDBの専門知識をさらに高めてください。