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 操作を行う方法を説明しました。