MongoDB をコマンドラインクライアントで使う (基本編)
MongoDB サーバーの実行
MongoDB をインストールしたら、MongoDB を直ちに実行できます。
MongoDB サーバーを実行するには、 C:\data\mongodb-win32-<バージョン番号>\bin\mongod.exe を (オプション無しでそのまま) 実行すれば OK です。
mongod.exe が MongoDB サーバーであり、mongo.exe はコマンドラインクライアントなので注意してください。
初めて実行する時は、ネットワークの警告が表示されると思いますがこれは許可してください。
これは、MongoDB がデフォルトでポート番号 27017 でクライアントの接続を待ち受けるからです。
このときに、mongod.exe を実行するとウィンドウが開きますがこれは開いたままにしてください。これを閉じると、サーバープロセスが終了してしまい、以下のテストに失敗します。 (逆にうまく行かない時は、mongod.exe を起動しなおしてみてください)
コマンドラインクライアントの利用
コマンドラインクライアントの開始
コマンドプロンプトを開き、C:\data\mongodb-win32-<バージョン番号>\bin\mongo.exe を実行します。
C:\data\mongodb-win32-x86_64-1.4.3\bin>mongo MongoDB shell version: 1.4.3 url: test connecting to: test type "exit" to exit type "help" for help >
上のように表示されれば OK です。
もし次のように表示されたら、サーバーに接続ができなかったことを示していますので、 mongod.exe を起動しなおすなり、ネットワークの設定を見直してください。
MongoDB shell version: 1.4.3 url: test connecting to: test Sat Jun 19 12:33:04 JS Error: Error: couldn't connect: couldn't connect to server 127.0.0.1 127.0.0.1:27017 (anon):952 Sat Jun 19 12:33:04 User Exception 12513:connect failed exception: connect failed
データの保存
それではいきなり、MongoDB にデータを保存してみましょう。
db.things がデフォルトのデータのコレクションを表しています。コレクションは、単純なキー・バリューペア (Key/Value Pair) を表します。 また、MongoDB はデータを JSON 形式で表記します。
ということで、デフォルトのコレクションにデータを保存する場合は、コレクションの save メソッドを利用して次のようにします。
db.things.save( JSON表記 );
具体例は次の通りです。
> db.things.save({"first_name":"Keisuke","email":"dadosan@keicode.com"});
データの取得
データベースに格納されているデータ (JSON スタイルオブジェクト) を表示するには、find メソッドを利用します。
> db.things.find(); { "_id" : ObjectId("4c1cfb479b6f0000000066c0"), "first_name" : "Keisuke", "email" : "dadosan@keicode.com" }
また、ある条件に合致するデータだけを取得するには、次のように find メソッドでキー・バリューを指定します。
> db.things.find( {"color":"white"} ); { "_id" : ObjectId("4c1cf9309b6f0000000066be"), "color" : "white", "name" : "Sienna LE" } { "_id" : ObjectId("4c1cf9ce9b6f0000000066bf"), "color" : "white", "name" : "Sentra" }
その他、コンディションオペレータなどによる指定もありますが、これはまた別の資料で説明します。
変数の利用
また、コマンドラインクライアントでは次のように変数を利用することも可能です。
> car1 = { "color":"white", "name":"Sienna LE" }; { "color" : "white", "name" : "Sienna LE" } > db.things.save(car1); > db.things.find(); { "_id" : ObjectId("4c1cf9309b6f0000000066be"), "color" : "white", "name" : "Sienna LE" }
for の利用
繰り返し処理では次のように、for 文を利用することもできます。
> for(var i=0; i<10; i++) db.things.save( { "x": i } ); > db.things.find(); ... { "_id" : ObjectId("4c1cfd189b6f0000000066c1"), "x" : 0 } { "_id" : ObjectId("4c1cfd189b6f0000000066c2"), "x" : 1 } { "_id" : ObjectId("4c1cfd189b6f0000000066c3"), "x" : 2 } { "_id" : ObjectId("4c1cfd189b6f0000000066c4"), "x" : 3 } { "_id" : ObjectId("4c1cfd189b6f0000000066c5"), "x" : 4 } { "_id" : ObjectId("4c1cfd189b6f0000000066c6"), "x" : 5 } { "_id" : ObjectId("4c1cfd189b6f0000000066c7"), "x" : 6 } { "_id" : ObjectId("4c1cfd189b6f0000000066c8"), "x" : 7 } { "_id" : ObjectId("4c1cfd189b6f0000000066c9"), "x" : 8 } { "_id" : ObjectId("4c1cfd189b6f0000000066ca"), "x" : 9 }
データの削除
データを削除するには、remove メソッドを利用します。
上で保存した、"x" が 0, 1, 2, ... のデータを消すには、次のようにします。
> for(var i=0; i<10; i++) db.things.remove( { "x" : i } );
データの更新
データを更新するには、update メソッドを利用します。
update メソッドは次のようなパラメータを受け取ります。
update( "更新するオブジェクト", "更新する内容", アップサートフラグ, 複数アップデートフラグ );
要は、第一、第二引数で、どれをどう変更するのか指定します。
第三引数のアップサートフラグというのは upsert のことで、「あれば更新 (update)。無ければインサート (insert)」 ということです。 upsert を行う場合は true です。
第四引数の複数アップデートというのは、デフォルトでは最初に見つかったデータだけを更新しますので、 条件に合うもの全てを更新する場合は、これを true にします。
試しにデータを作成して、更新してみましょう
ちなみに、データと言ってますが、MongoDB の資料では「ドキュメント」 と言います。
> db.things.save( { "name": { "f":"Keisuke", "l":"Oyama" }, "age": 1 } ); > db.things.find(); { "_id" : ObjectId("4c1d02639b6f0000000066d5"), "name" : { "f" : "Keisuke", "l" : "Oyama" }, "age" : 1 }
年齢 "age" として 1 としていますが、これを 20 に変更します。
> db.things.update( { "name": { "f":"Keisuke", "l":"Oyama" }, "age": 1 }, { "name": { "f":"Keisuke", "l":"Oyama" }, "age": 20 } ); > db.things.find(); { "_id" : ObjectId("4c1d02639b6f0000000066d5"), "name" : { "f" : "Keisuke", "l" : "Oyama" }, "age" : 20 }
確かに 20 に書き換わりました.
この 20 をインクリメントするには、次のように $inc オペレータを利用して、次のようにできます。
> db.things.update( { "name": { "f":"Keisuke", "l":"Oyama" }, "age": 20 }, { $inc : { "age" : 1 } } ); > db.things.find(); { "_id" : ObjectId("4c1d02639b6f0000000066d5"), "name" : { "f" : "Keisuke", "l" : "Oyama" }, "age" : 21 }
確かに "age" が $inc に指定した増分だけ、インクリメントされています。