ドキュメントの作成
MongoDBでは、insertOne()およびinsertMany()メソッドを使用してコレクションにドキュメントを挿入します。
1. 単一ドキュメントの挿入
単一のドキュメントをusersコレクションに挿入する例です。
db.users.insertOne({
"username": "tarou",
"email": "tarou@example.com",
"age": 30
})
このコマンドは、挿入されたドキュメントとその一意のID(_id)を含む結果を返します。
2. 複数ドキュメントの挿入(バルクインサート)
複数のドキュメントを一度に挿入するには、insertMany()を使用します。
db.users.insertMany([
{
"username": "hanako",
"email": "hanako@example.com",
"age": 25
},
{
"username": "sachiko",
"email": "sachiko@example.com",
"age": 28
}
])
3. エラー処理付きの挿入
バルクインサート中にエラーが発生した場合の処理をtry-catchブロックで管理できます。
try {
db.users.insertMany([
{ "username": "yuki", "age": 22 },
{ "username": "kenji", "email": "kenji@example.com", "age": 35 }
]);
} catch (error) {
print("挿入エラー: " + error);
}
ドキュメントの読み取り
find()メソッドは、コレクション内のドキュメントを検索するために使用されます。
1. すべてのドキュメントを検索
db.users.find()
2. 条件に基づく検索
特定の条件に一致するドキュメントを検索します。
// ageが30以上のユーザーを検索
db.users.find({ "age": { $gte: 30 } })
3. 最初のドキュメントを取得
検索結果の最初のドキュメントのみを取得します。
db.users.findOne({ "age": { $lt: 30 } })
4. 投影クエリ
投影を使用すると、返されるドキュメントのフィールドを指定できます。デフォルトでは_idが含まれます。
// nameとemailフィールドのみを返す
db.users.find({ "age": 30 }, { "username": 1, "email": 1 })
// _idフィールドを除外する
db.users.find({ "age": 30 }, { "username": 1, "email": 1, "_id": 0 })
5. ドキュメント数のカウント
条件に一致するドキュメントの数をカウントします。
// すべてのドキュメントをカウント
db.users.countDocuments()
// ageが25以上のドキュメントをカウント
db.users.countDocuments({ "age": { $gte: 25 } })
6. ページネーション
limit()とskip()を使用して、結果をページ分割できます。
// 最初の2件のドキュメントを取得
db.users.find().limit(2)
// 最初の2件をスキップして、残りのドキュメントを取得
db.users.find().skip(2)
// ページネーションの例(ページサイズ2)
// 第1ページ
db.users.find().skip(0).limit(2)
// 第2ページ
db.users.find().skip(2).limit(2)
7. ソート
検索結果を昇順(1)または降順(-1)でソートします。
// ageで昇順にソート
db.users.find().sort({ "age": 1 })
// usernameで降順にソート
db.users.find().sort({ "username": -1 })
8. 複雑なクエリ
8.1 正規表現による検索
// usernameが"sa"で始まるドキュメントを検索
db.users.find({ "username": /^sa/ })
8.2 比較クエリ
// ageが30より大きい
db.users.find({ "age": { $gt: 30 } })
// ageが25以上
db.users.find({ "age": { $gte: 25 } })
// ageが30未満
db.users.find({ "age": { $lt: 30 } })
// ageが25以下
db.users.find({ "age": { $lte: 25 } })
8.3 包含クエリ
// ageが25または30のドキュメントを検索
db.users.find({ "age": { $in: [25, 30] } })
// ageが25でも30でもないドキュメントを検索
db.users.find({ "age": { $nin: [25, 30] } })
8.4 複数条件クエリ
$and、$orなどの論理演算子を使用して、複数の条件を組み合わせます。
// ageが25以上かつusernameが"tarou"のドキュメントを検索
db.users.find({ $and: [ { "age": { $gte: 25 } }, { "username": "tarou" } ] })
ドキュメントの更新
既存のドキュメントを更新するには、updateOne()またはupdateMany()を使用します。
1. ドキュメントの上書き更新
一致する最初のドキュメントを完全に置き換えます。
// usernameが"tarou"のドキュメントを上書き
db.users.updateOne(
{ "username": "tarou" },
{ "username": "taro", "email": "taro.new@example.com", "age": 31 }
)
2. 局所的な更新(特定フィールドの更新)
$setオペレータを使用して、ドキュメントの特定のフィールドのみを更新します。
// usernameが"hanako"のドキュメントのageを26に更新
db.users.updateOne(
{ "username": "hanako" },
{ $set: { "age": 26 } }
)
3. 複数ドキュメントの更新
条件に一致するすべてのドキュメントを更新します。
// ageが25以上のすべてのユーザーのstatusを"active"に設定
db.users.updateMany(
{ "age": { $gte: 25 } },
{ $set: { "status": "active" } }
)
4. フィールド値のインクリメント
$incオペレータを使用して、数値フィールドの値を増分または減分します。
// usernameが"sachiko"のドキュメントのageを1増やす
db.users.updateOne(
{ "username": "sachiko" },
{ $inc: { "age": 1 } }
)
// ageを1減らす
db.users.updateOne(
{ "username": "sachiko" },
{ $inc: { "age": -1 } }
)
5. 新しいフィールドの追加
存在しないフィールドを追加する場合も、$setを使用します。
// usernameが"yuki"のドキュメントに"lastLogin"フィールドを追加
db.users.updateOne(
{ "username": "yuki" },
{ $set: { "lastLogin": new Date() } }
)
ドキュメントの削除
ドキュメントを削除するには、deleteOne()またはdeleteMany()を使用します。
1. 単一ドキュメントの削除
指定された条件に一致する最初のドキュメントを削除します。
// usernameが"kenji"のドキュメントを削除
db.users.deleteOne({ "username": "kenji" })
2. 複数ドキュメントの削除
条件に一致するすべてのドキュメントを削除します。
// statusが"inactive"のすべてのドキュメントを削除
db.users.deleteMany({ "status": "inactive" })
// すべてのドキュメントを削除(非常に注意が必要)
// db.users.deleteMany({})