MongoDBは、NoSQL系( “Not only SQL” )のデータベースです。
MySQLやPostgreSQLなどの伝統的なRDBMS(リレーショナルデータベース管理システム)と比べ、データ形式の違いに柔軟に対応出来るというメリットがあります。
これは、データ毎の構造のバラツキが大きい場合や、そもそもデータ構造が良く分からない時に威力を発揮します。
この記事では、MongoDBをMacにインストールし、コマンドラインから簡単なDB操作について解説します。
MongoDBをMACに導入する方法
MongoDBをMACにインストールするには、大きく2つの方法があります。
- Homebrewを利用
- ファイルをダウンロードして手動でインストール
細かい手順は、公式マニュアルを見て欲しいのですが、「Homebrew」を使用する方が簡単ですので、この記事では「Homebrew」を利用する方法を解説します。
Homebrewを使ったインストール
パッケージ管理システムの「Homebrew」を利用して「MongoDB」をインストールします。
「brew」はビールの醸造で「homebrew」は自家醸造、つまりパッケージを自分で醸造するイメージですね。
「Homebrew」は「Ruby」で書かれています。インストールがまだの人は、以下の公式サイトからダウンロードして下さい。
Homebrewの「tap」をインストール
まず、Homebrewの「tap」をインストールし、インストール可能なパッケージを拡張します。
ターミナルで以下のコマンドを打ち込みましょう。
brew tap mongodb/brew
無事に完了すると、以下の様なメッセージが表示されます。
==> Tapping mongodb/brew Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'... remote: Enumerating objects: 13, done. remote: Counting objects: 100% (13/13), done. remote: Compressing objects: 100% (10/10), done. remote: Total 13 (delta 4), reused 5 (delta 1), pack-reused 0 Unpacking objects: 100% (13/13), done. Tapped 6 formulae (45 files, 59.7KB).
「mongodb-community」をインストール
それでは、「mongodb-community」をインストールします。
brew install mongodb-community
バージョンを指定したい場合は、「@4.2」の様に@をつけてバージョンを指定します。
brew install mongodb-community@4.2
インストールが完了すると、以下のメッセージが表示されます。
==> Installing mongodb-community from mongodb/brew ==> Downloading https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.2.1.tgz ######################################################################## 100.0% ==> Caveats To have launchd start mongodb/brew/mongodb-community now and restart at login: brew services start mongodb/brew/mongodb-community Or, if you don't want/need a background service you can just run: mongod --config /usr/local/etc/mongod.conf ==> Summary
Caveatsって何ぞや?
「Caveats(注意事項)」って単語、エンジニア界隈では結構使うので覚えておいて損は無いです。
同僚のアメリカ人に、いきなり「キャビアー」とか、「キャビアーッ」って言われ、
「え、キャビアって何?あの高級なサメの卵?」
と混乱してましたが、例えばこんな風に使います。
Sound great? There’s just one caveat: Knowledge about how genes work is still in the scientific Stone Age.
の様に「どう、良さそう?だけど、〜に注意してね」って感じのニュアンスで使われる事が多いです。
mongoDBのバージョン確認
無事にインストールされているか、「mongo –version」でバージョンを確認します。
mongo --version MongoDB shell version v4.2.1 git version: edf6d45851c0b9ee15548f0f847df141764a317e allocator: system modules: none build environment: distarch: x86_64 target_arch: x86_64
この例では、「バージョン4.2.1」がダウンロードされてますね。
mongoDBの起動・停止方法
mongoDBの起動は、「brew services start」コマンドで可能です。
brew services start mongodb-community ==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-commu
サービスを停止したい場合は、「brew services stop」コマンドを実行します。簡単ですね。
brew services stop mongodb-community Stopping `mongodb-community`... (might take a while) ==> Successfully stopped `mongodb-community` (label: homebrew.mxcl.mongodb-commu
mongoDBの中身を確認
それでは、mongoDBを再度起動して、ローカルのmongoDBに「mongo」コマンドで接続します。
brew services start mongodb-community ==> Successfully started `mongodb-community` (label: homebrew.mxcl.mongodb-community) mongo
まず、MongoDBの中身を「show dbs」コマンドで確認してみましょう。
> show dbs admin 0.000GB config 0.000GB local 0.000GB
MongoDBにデフォルトに存在するデータベースが表示されます。
いずれも空なのでファイルサイズは0GBです。
データベースの作成
それでは、新しいデータベースを作成してみましょう。
データベースの作成は「use <データベース名>」です。
商品DBとして「product」を作ってみます。
> use product switched to db product
今回は、新しいデータベースを作成しましたが、データベースが存在する場合は指定したデータベースに接続します。
接続しているDBの確認
接続しているデータベースは「dbコマンド」で確認出来ます。
> db product
練習として、「admin」データベースに接続を切り替え、接続されているDBを確認してみましょう。
> use admin switched to db admin > db admin
接続の切り替えは、「use <データベース名>」で「db」で表示です。
簡単ですね?
コレクションの作成
コレクションは、SQLデータベースでのテーブルに該当する概念です。
SQL | Non-SQL |
テーブル | コレクション |
行 | ドキュメント |
コレクションは、「db.createCollection(“<コレクション名>”)」で作成する事が出来ます。
> db.createCollection("products") { "ok" : 1 }
コレクションが作成された後、「show dbs」コマンドでDBが追加された事を確認出来ます。
> show dbs admin 0.000GB config 0.000GB local 0.000GB product 0.000GB
ドキュメントの作成(データの投入)
それでは、実際のデータ(ドキュメント)を作成していきましょう。
ドキュメントの作成は、「db.<コレクション名>.insertOne」で可能です。
> db.products.insertOne({_id:1, category:"Shoes", brand:"Calvin Klein"}) { "acknowledged" : true, "insertedId" : 1 }
それでは、2件目のデータを投入してみましょう。「description」がある所が1件目と違うのですが、問題なく投入出来ます。
> db.products.insertOne({_id:2, category:"Shoes", brand:"Michael Kors",description:"Evening Platform Pumps"}) { "acknowledged" : true, "insertedId" : 2 }
複数のデータを投入するには、「insertMany」を使用します。
コレクションの中身を全件確認する
中身を確認するには、「db.<コレクション名>.find({})」コマンドを使用します。
> db.products.find({}) { "_id" : 1, "category" : "Shoes", "brand" : "Calvin Klein" } { "_id" : 2, "category" : "Shoes", "brand" : "Michael Kors", "description" : "Evening Platform Pumps" }
「db.<コレクション名>.find({}).pretty()」コマンドで、DBの中身を見やすい形に整形してくれます。
> db.products.find({}).pretty() { "_id" : 1, "category" : "Shoes", "brand" : "Calvin Klein" } { "_id" : 2, "category" : "Shoes", "brand" : "Michael Kors", "description" : "Evening Platform Pumps" }
ドキュメントを検索(フィルタリング)して表示
検索して表示するには、「find({ <field>:<value> })」と「キー」と「値」を指定します。
> db.products.find({brand: "Calvin Klein"}) { "_id" : 1, "category" : "Shoes", "brand" : "Calvin Klein" }
必要な項目のみ取得
必要な項目のみを表示するには、findの第2引数でキーの値に1を指定します。例えば、「category」のみ表示したい場合は以下の様になります。
> db.products.find({},{category: 1}) { "_id" : 1, "category" : "Shoes" } { "_id" : 2, "category" : "Shoes" }
「_id」はデフォルトで表示されるので、表示したくない場合は明示的に0を指定してあげます。
> db.products.find({},{_id:0, category: 1}) { "category" : "Shoes" } { "category" : "Shoes" }
「category」のみの表示になりましたね。
ドキュメントの更新
データの更新は、「db.<コレクション名>.updateOne(<フィルター>,<オペレペレーション>)」で行う事が出来ます。
> db.products.find().pretty() { "_id" : 1, "category" : "Shoes", "brand" : "Calvin Klein" } { "_id" : 2, "category" : "Shoes", "brand" : "Michael Kors", "description" : "Evening Platform Pumps" } > db.products.updateOne({"_id":1},{$set: {"category":"Bag"}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } > db.products.find().pretty() { "_id" : 1, "category" : "Bag", "brand" : "Calvin Klein" } { "_id" : 2, "category" : "Shoes", "brand" : "Michael Kors", "description" : "Evening Platform Pumps" }
「category」が「shoes=>bag」へとアップデートされたのが確認出来たと思います。
ドキュメントの削除
ドキュメントの削除は、「db.<コレクション名>.deleteOne(<フィルター>)」で可能です。
例えば、id番号が2のドキュメントを削除してみましょう。
> db.products.deleteOne({_id:2}) { "acknowledged" : true, "deletedCount" : 1 } > db.products.find().pretty() { "_id" : 1, "category" : "Bag", "brand" : "Calvin Klein" }
CRUDオペレーション
CRUD(作成/読み取り/更新/削除)オペレーションについて学習してきましたが、CRUD操作についての公式サイトを見ておく事をオススメします。