🍃

MongoDB基礎3:ドキュメントの操作

4 min read

引き続き、MongoDB Universityで提供されているオンラインコース"MongoDB Basics"から要点をまとめていきます。今日はChapter3 - "Creating and Manipulating Documents"です。

前回の記事では、既にあるデータにアクセスする方法について書きました。今回の記事では新しくデータを作成や更新、または削除する方法についてまとめていきます。

ドキュメントの作成

MongoDBのサンプルコレクションを用いて、ドキュメントを挿入してみます。

  1. まずは、クラスターに接続します。
mongo "mongodb+srv://<username>:<password>@<cluster>.mongodb.net/admin"
  1. 使用するデータベースを参照します。
> use sample_training
  1. ランダムにドキュメントを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
	}
}

findOne()は該当するドキュメントを一つだけ返してくれるメソッド。

  1. 表示されたドキュメントを挿入してみる。
> 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")

もしこのキーとバリューのみを消して、挿入してみるとどうなるでしょうか?やってみました。

  1. 表示されたドキュメント(_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 })
バッチリいけました。
  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フィールドは自動で割り当てられる識別子のような役割を持っていることがわかります。

複数ドキュメントの同時挿入もできるみたい。

> db.inspections.insert([ { "test": 1 }, { "test": 2 }, { "test": 3 } ])

ドキュメントの更新

検索のメソッド同様、更新のメソッドにも一つに向けたものと複数に向けたものがあります。

メソッド 1つのドキュメント 複数のドキュメント
検索 findOne() find()
更新 updateOne() updateMany()

更新オペレーター

ドキュメントの更新には更新オペレーターを引数に指定する必要があります。

例えば以下のようなコマンドがあったとき、

> db.zips.updateOne({ "city": "mongo" }, { "$set": { "population": 10000} })

$setが更新オペレーターにあたり、この場合city:mongopopulationの値を10000に更新します。(populationフィールドが元々ない場合は追加)

次に$set$incに置き換えて再度実行してみます。

> db.zips.updateOne({ "city": "mongo" }, { "$inc": { "population": 10000} })

するとcity:mongopopulationの値は20000に更新されます。$incは指定したフィールドの値を増加(increment)させるオペレーターだからです。

※ 他にも結構ある更新オペレーター

https://docs.mongodb.com/manual/reference/operator/update/

ドキュメントの削除

検索・更新のメソッド同様、削除のメソッドにも一つに向けたものと複数に向けたものがあります。

メソッド 1つのドキュメント 複数のドキュメント
検索 findOne() find()
更新 updateOne() updateMany()
削除 delteOne() delteMany()

※ コレクションの削除はdrop()

db.<コレクション名>.drop()

まとめ

  • ドキュメントの作成はinsert()で実行。_idフィールドがドキュメントの識別子。
  • ドキュメントの更新はupdateOne()updateMany()で実行。オペレーターをうまく使う。
  • ドキュメントの削除はdeleteOne()deleteMany()で実行。コレクションの削除はdrop()

Discussion

ログインするとコメントできます