MongoDB基礎3:ドキュメントの操作
引き続き、MongoDB Universityで提供されているオンラインコース"MongoDB Basics"から要点をまとめていきます。今日はChapter3 - "Creating and Manipulating Documents"です。
前回の記事では、既にあるデータにアクセスする方法について書きました。今回の記事では新しくデータを作成や更新、または削除する方法についてまとめていきます。
ドキュメントの作成
MongoDBのサンプルコレクションを用いて、ドキュメントを挿入してみます。
- まずは、クラスターに接続します。
mongo "mongodb+srv://<username>:<password>@<cluster>.mongodb.net/admin"
- 使用するデータベースを参照します。
> use sample_training
- ランダムにドキュメントを1つ表示します。
> db.inspections.findOne();
{
"_id" : ObjectId("56d61033a378eccde8a8354f"),
"id" : "10021-2015-ENFO",
"certificate_number" : 9278806,
"business_name" : "ATLIXCO DELI GROCERY INC.",
"date" : "Feb 20 2015",
"result" : "No Violation Issued",
"sector" : "Cigarette Retail Dealer - 127",
"address" : {
"city" : "RIDGEWOOD",
"zip" : 11385,
"street" : "MENAHAN ST",
"number" : 1712
}
}
- 表示されたドキュメントを挿入してみる。
> db.inspections.insert({
"_id" : ObjectId("56d61033a378eccde8a8354f"),
"id" : "10021-2015-ENFO",
"certificate_number" : 9278806,
"business_name" : "ATLIXCO DELI GROCERY INC.",
"date" : "Feb 20 2015",
"result" : "No Violation Issued",
"sector" : "Cigarette Retail Dealer - 127",
"address" : {
"city" : "RIDGEWOOD",
"zip" : 11385,
"street" : "MENAHAN ST",
"number" : 1712
}
})
結果は失敗。以下のようなエラーメッセージが表示されました。
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: sample_training.inspections index: _id_ dup key: { _id: ObjectId('56d61033a378eccde8a8354f') }"
}
})
"duplicate key error"...以下のバリューがダブっているから。
"_id" : ObjectId("56d61033a378eccde8a8354f")
もしこのキーとバリューのみを消して、挿入してみるとどうなるでしょうか?やってみました。
- 表示されたドキュメント(
_id
なし)を挿入してみる。
> db.inspections.insert({
"id" : "10021-2015-ENFO",
"certificate_number" : 9278806,
"business_name" : "ATLIXCO DELI GROCERY INC.",
"date" : "Feb 20 2015",
"result" : "No Violation Issued",
"sector" : "Cigarette Retail Dealer - 127",
"address" : {
"city" : "RIDGEWOOD",
"zip" : 11385,
"street" : "MENAHAN ST",
"number" : 1712
}
})
WriteResult({ "nInserted" : 1 })
バッチリいけました。
- 挿入できたドキュメントを確認する。
> db.inspections.find({ "id" : "10021-2015-ENFO", "certificate_number" : 9278806})
元からあったドキュメントと今挿入したドキュメントの二つが確認できました。
{ "_id" : ObjectId("56d61033a378eccde8a8354f"), "id" : "10021-2015-ENFO", "certificate_number" : 9278806, "business_name" : "ATLIXCO DELI GROCERY INC.", "date" : "Feb 20 2015", "result" : "No Violation Issued", "sector" : "Cigarette Retail Dealer - 127", "address" : { "city" : "RIDGEWOOD", "zip" : 11385, "street" : "MENAHAN ST", "number" : 1712 } }
{ "_id" : ObjectId("615ef3d06d770c26095085a4"), "id" : "10021-2015-ENFO", "certificate_number" : 9278806, "business_name" : "ATLIXCO DELI GROCERY INC.", "date" : "Feb 20 2015", "result" : "No Violation Issued", "sector" : "Cigarette Retail Dealer - 127", "address" : { "city" : "RIDGEWOOD", "zip" : 11385, "street" : "MENAHAN ST", "number" : 1712 } }
_id
フィールドのみ、バリューが異なっています。このことから、_id
フィールドは自動で割り当てられる識別子のような役割を持っていることがわかります。
ドキュメントの更新
検索のメソッド同様、更新のメソッドにも一つに向けたものと複数に向けたものがあります。
メソッド | 1つのドキュメント | 複数のドキュメント |
---|---|---|
検索 | findOne() | find() |
更新 | updateOne() | updateMany() |
更新オペレーター
ドキュメントの更新には更新オペレーターを引数に指定する必要があります。
例えば以下のようなコマンドがあったとき、
> db.zips.updateOne({ "city": "mongo" }, { "$set": { "population": 10000} })
$set
が更新オペレーターにあたり、この場合city:mongo
のpopulation
の値を10000
に更新します。(population
フィールドが元々ない場合は追加)
次に$set
を$inc
に置き換えて再度実行してみます。
> db.zips.updateOne({ "city": "mongo" }, { "$inc": { "population": 10000} })
するとcity:mongo
のpopulation
の値は20000
に更新されます。$inc
は指定したフィールドの値を増加(increment)させるオペレーターだからです。
※ 他にも結構ある更新オペレーター
ドキュメントの削除
検索・更新のメソッド同様、削除のメソッドにも一つに向けたものと複数に向けたものがあります。
メソッド | 1つのドキュメント | 複数のドキュメント |
---|---|---|
検索 | findOne() | find() |
更新 | updateOne() | updateMany() |
削除 | delteOne() | delteMany() |
drop()
※ コレクションの削除はdb.<コレクション名>.drop()
まとめ
- ドキュメントの作成は
insert()
で実行。_id
フィールドがドキュメントの識別子。 - ドキュメントの更新は
updateOne()
・updateMany()
で実行。オペレーターをうまく使う。 - ドキュメントの削除は
deleteOne()
・deleteMany()
で実行。コレクションの削除はdrop()
Discussion