MongoDB の基本的なCRUD操作

ここでは MongoDB シェルで基本的な CRUD 操作 (Create, Read, Update, Delete) を行う方法を紹介します。

詳細なリファレンスではないので、詳細についてはリファレンス等を参照してください。

サンプルデータは「MongoDB のクエリーのサンプルデータ」からダウンロードして、MongoDB に取り込んでください。

MongoDB ドキュメントの作成

MongoDB で単一のドキュメントを作成する

ドキュメントを一つ作成するには insertOne() メソッドを使います。

作成する (コレクションに挿入する) ドキュメントの内容を引数に渡して実行すれば、ドキュメントが作成されます。

db.getCollection('states').insertOne({
  code: 'TX',
  name: 'Texas',
})

MongoDB で複数のドキュメントを作成する

複数のドキュメントを作成するには insertMany() メソッドを使います。作成したいドキュメントを、配列として渡します。

db.getCollection('states').insertMany([
  {
    code: 'AZ',
    name: 'Arizona',
  },
  {
    code: 'NV',
    name: 'Nevada',
  },
])

作成されたドキュメントには ID フィールド (_id) が自動的に追加されます。もし、明示的に _id というフィールドを渡せば、それが ID として使われます。

MongoDB で値の重複を許可しないようインデックスを作成する方法

尚、この例の「アメリカの州名」コレクションのように「コード」と「名前」の一覧を保持するような場合、 コードは一意で、重複を許可したくない場合があります。

この場合、 codeにインデックスを作成してユニーク (unique, 一意) を true とします。

db.getCollection('states').createIndex({ code: 1 }, { unique: true })

MongoDB ドキュメントの読込み

find() メソッドにデータの抽出条件を記載します。

db.getCollection('malls')
  .find({
    numberOfStores: {
      $gte: 200,
    },
  })
  .sort({ numberOfStores: 1 })

基本的なクエリーについては「MongoDB の基本的なクエリ10個」をご覧ください。

MongoDB ドキュメントの更新

MongoDB の updateOne() でひとつのドキュメントを更新

1つのドキュメントを更新するにはupdateOne()メソッドを使います。

基本的なパターンは、次のように引数に「フィルター」「更新内容」「オプション」を渡します。

db.getCollection('malls').updateOne(
  filter, // フィルター
  values, // 更新内容
  options // オプション
)

フィルターは更新するドキュメントの抽出条件。更新内容は新しい値。オプションは後述の upsert (存在しない場合は挿入) などのオプション値です。指定しなくても構いません。

db.getCollection('malls').updateOne(
  { name: 'Destiny USA' },
  {
    $set: {
      phone: '(315) 466-6000',
    },
  }
)

MongoDB の埋め込みドキュメント内の1つのフィールドを更新

埋め込みドキュメント (embedded document) のフィールドを指定するには、 . でフィールドを指定します。この時フィールド名側にも引用符が必要です。

db.getCollection('malls').updateOne(
  { name: 'Destiny USA' },
  {
    $set: {
      phone: '(315) 466-6000',
      'address.state': 'NY',
    },
  }
)

MongoDB のドキュメント更新時にタイムスタンプを設定

ドキュメント更新時に $currentDate: { フィールド名: true } とすることで、 ドキュメント更新時刻を Date 型で指定したフィールドに設定できます。タイムスタンプをセットするのに便利です。

db.getCollection('malls').updateOne(
  { name: 'Camarillo Premium Outlets' },
  {
    $set: {
      numberOfStores: NumberInt(150),
    },
    $currentDate: {
      lastModified: true,
    },
  }
)

MongoDB の updateOne() でフィルターにマッチしない場合にドキュメントを挿入

フィルターにマッチするドキュメントが存在しない場合は、既定では更新しません。

ただし、オプションで upsert: true とすると、ドキュメントを挿入します。"upsert" という言葉は、update (更新) と insert (挿入) を組み合わせた言葉です。

次の例では、フィルター条件 name: 'Camarillo Premium Outlets' に何もマッチしない場合は、ドキュメントを挿入します。

db.getCollection('malls').updateOne(
  { name: 'Camarillo Premium Outlets' },
  {
    $set: {
      name: 'Camarillo Premium Outlets',
      numberOfStores: NumberInt(155),
      address: {
        street: '740 Ventura Blvd',
        city: 'Camarillo',
        state: 'CA',
        zip: '93010',
      },
      stores: [
        'Aerie', 'Aeropostale', 'American Eagle Outfitters',
        'Ann Taylor Factory Store', 'Banana Republic Factory Store',
        'Coach Outlet', 'Gap Facotry', 'Old Navy Outlet',
        'Prada', 'Q',
      ],
    },
    $currentDate: {
      lastModified: true,
    },
  },
  {
    upsert: true,
  }
)

MongoDB で複数のドキュメントを更新

複数のドキュメントを更新するには updateMany() メソッドを使います。 使い方は updateOne() と同様です。フィルター条件に合致したドキュメント、全てを更新する点が異なります。

全てのドキュメントに、 lastModified というフィールドに現在の時刻を設定するには、フィルターを空にして、次のようにします。

db.getCollection('malls').updateMany(
  {},
  {
    $currentDate: {
        lastModified: true
    }
  }
)

MongoDB でドキュメントの特定のフィールドを削除

MongoDB のドキュメントの特定のフィールドを削除するには、 $unset 演算子を使います。

$unset: { フィールド名: '' } とすることで、指定したフィールドが削除されます。

db.getCollection('malls').updateMany(
  {},
  {
    $unset: { lastModified: '' },
  }
)

MongoDB ドキュメントの削除

MonboDB でドキュメントを削除するには、 deleteOne() メソッド、または、 メソッドを使います。

それぞれの第一引数には、ドキュメントのフィルター抽出条件を渡します。 deleteOne() ではフィルターに合致したドキュメントを一つ削除し、 deleteMany() ではフィルターに合致した全てのドキュメントを削除します。

例えば、 nameフィールドに Camarillo Premium という文字を含むドキュメントを一つ削除するには、次のようにします。

db.getCollection('malls').deleteOne(
  { name: /Camarillo Premium/i }
)

以上で、MongoDB で基本的な CRUD 操作を行う方法を説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Node.js 入門