MongoDB:ドキュメントの作成、読み取り、更新、削除

ドキュメントの作成

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({})

タグ: MongoDB NoSQL データベース CRUD操作

6月21日 19:56 投稿