MongoDBでデータの挿入・検索・更新・削除を行う
MongoDBはNoSQLと呼ばれるデータベースのひとつ。
NoSQLは「Not Only SQL」の略語で、OracleやMySQL、PostgreSQL等のRDBMS(Relational Database Management System)とは違い、固定されたスキーマに縛られない、関係モデルの結合操作を利用しない、トランザクションを利用できない等の特徴がある。
NoSQL系データベースが有用な場面は、関係モデルを必要としないデータを扱うときや、大量のデータを扱う時。
MongoDBの特徴としては、ドキュメント指向と呼ばれるXMLやJSON等のようにスキーマレスでデータ構造が柔軟である点が上げられる。
また、MySQLやPostgerSQLと同じくオープンソースである。
今回は、最初からMongoDBがインストールされているCloud9上でMongoDBを利用してみる。
適当なプロジェクトを作成
workspace直下にデータベース用のディレクトリを作成する。
1 | $ mkdir db |
MongoDBを起動
コンソールの最後にwaiting for connections on port 27017と表示されれば起動成功。
1 | $ mongod --nojournal --noprealloc --dbpath db |
MongoDBのコンソールに接続
1 2 3 4 | $ mongo MongoDB shell version: 2.6.9 connecting to: test > |
MongoDBの構造は、RDBMSのデータベースに当たる部分は同じだが、テーブルに相当するものはコレクションと呼び、その中のレコードに相当するものをドキュメントと呼ぶ。
まずデータベースを作成し、次にコレクションを作成する。
コレクションに対してドキュメントの作成、参照、更新、削除を行っていく。
今回は「mydb」というデータベースを作成する。
1 2 3 | > use mydb switched to db mydb > |
useコマンドで使うデータベースを指定するだけで新たに作成出来る。
既存のデータベースをuseコマンドで指定するとそのデータベースを使う、という命令になる。
コレクションを作成し、同時にinsertコマンドでドキュメントを挿入する。
今回は「myinfo」という名前のコレクションを作成し、その中にデータを入れていく。
1 2 3 | > db.myinfo.insert({"name":"Reon", "age":"20", "birthplace":"Tokyo", "hobby":["Reading", "drive"]}) WriteResult({ "nInserted" : 1 }) > |
エラーが表示されなければ成功している。
もう一つドキュメントを挿入。
1 2 3 | > db.myinfo.insert({"name":"Santa", "age":"18", "birthplace":"Kanagawa"}) WriteResult({ "nInserted" : 1 }) > |
データ構造が先ほどと違っていても同じコレクションに問題なく保存出来る。
では次にfind()メソッドを使用して参照をする。
1 2 3 4 | > db.myinfo.find() { "_id" : ObjectId("557f6da57919595c9df1b2fd"), "name" : "Reon", "age" : "20", "birthplace" : "Tokyo", "hobby" : [ "Reading", "drive" ] } { "_id" : ObjectId("557f6df27919595c9df1b2fe"), "name" : "Santa", "age" : "18", "birthplace" : "Kanagawa" } > |
先ほど入力したコレクションが参照できた。
findOne()メソッドを使用すると先頭のドキュメント一つのみを取得する。
1 2 3 4 5 6 7 8 9 10 11 12 | > db.myinfo.findOne() { "_id" : ObjectId("557f6da57919595c9df1b2fd"), "name" : "Reon", "age" : "20", "birthplace" : "Tokyo", "hobby" : [ "Reading", "drive" ] } > |
find()やfindOne()メソッドは条件検索も可能。
1 2 3 | > db.myinfo.find({"name":"Reon"}) { "_id" : ObjectId("557f6da57919595c9df1b2fd"), "name" : "Reon", "age" : "20", "birthplace" : "Tokyo", "hobby" : [ "Reading", "drive" ] } > |
1 2 3 4 5 6 7 8 | > db.myinfo.findOne({"birthplace":"Kanagawa"}) { "_id" : ObjectId("557f6df27919595c9df1b2fe"), "name" : "Santa", "age" : "18", "birthplace" : "Kanagawa" } > |
次にデータの更新。
現在のデータでは「name」が「Santa」であるデータには「hobby」が無いので追加してみる。
データの更新にはupdate()メソッドを使用する。
1 2 3 | > db.myinfo.update({name:"Santa"},{$set:{"hobby":["basketball", "Climbing"]}}, false, true) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > |
エラーが出ない場合、更新に成功している。
update()メソッドの引数に関しての補足
1 | update(condition, operation, upsert, multi) |
condition: この引数の条件に一致するドキュメントを更新する
operation: この引数の内容で更新する(更新オプションとして$inc/$set/$push/$popなどのオペレーションがある)
upsert: この引数がtrueの時、conditionの条件に一致しない場合は新たにデータが登録される(insert()と同じ動作を行う)
multi: この引数がtrueの時、conditionの条件に一致したデータ全てを更新する
更新結果の確認。
1 2 3 4 | > db.myinfo.find() { "_id" : ObjectId("557f6da57919595c9df1b2fd"), "name" : "Reon", "age" : "20", "birthplace" : "Tokyo", "hobby" : [ "Reading", "drive" ] } { "_id" : ObjectId("557f6df27919595c9df1b2fe"), "name" : "Santa", "age" : "18", "birthplace" : "Kanagawa", "hobby" : [ "basketball", "Climbing" ] } > |
「hobby」が追加されたことが確認できた。
次は削除を行う。
「Reon」のデータを削除してみる。
データを削除する場合はremove()メソッドを使用する。
1 2 3 | > db.myinfo.remove({name:"Reon"}) WriteResult({ "nRemoved" : 1 }) > |
エラーが出ない場合、削除に成功している。
結果をfind()メソッドで確認してみる。
1 2 3 | > db.myinfo.find() { "_id" : ObjectId("557f6df27919595c9df1b2fe"), "name" : "Santa", "age" : "18", "birthplace" : "Kanagawa", "hobby" : [ "basketball", "Climbing" ] } > |
「Reon」のドキュメントが削除されたことが確認できた。
ちなみにremove()メソッドの引数に何も入れない場合は、全てのドキュメントを削除するという命令になる。
その場合は空のコレクションのみが残った状態となる。
更にコレクションも削除したい場合はdrop()メソッドを使用する。
1 2 3 | > db.myinfo.drop() true > |
drop()メソッドの場合は成功した場合trueと表示される。