CLOVER🍀

That was when it all began.

Ubuntu Linux 18.04 LTSに、MongoDB 4.2をインストールする

これは、なにをしたくて書いたもの?

久しく触ってなかったMongoDBですが、ちょっと少し慣れておこうかなぁと思うところがありまして。

The most popular database for modern apps | MongoDB

今一度、インストールからやり直してみます。

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic


$ uname -srvmpio
Linux 4.15.0-88-generic #88-Ubuntu SMP Tue Feb 11 20:11:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu Linux 18.04 LTSです。

関連するドキュメントをざっと

ドキュメントサイトは、こちら。今回はMongoDB 4.2.3を使います。あと、使うのはCommunity Editionです。

The MongoDB 4.2 Manual — MongoDB Manual

ダウンロードページからOSとインストールパッケージを選んでみてもよいのですが、

Download Center: Community Server | MongoDB

f:id:Kazuhira:20200307230056p:plain

Ubuntu Linuxの場合はaptリポジトリを使ってもインストール可能なようなので、こちらを使ってみましょう。

Install MongoDB Community Edition on Ubuntu — MongoDB Manual

Ubuntu Linuxのパッケージで提供されているMongoDBをインストールしている場合は、アンインストールしておいてくださいね、と。

tar.gzを使ったインストールも可能です。

Install MongoDB Community on Ubuntu using .tgz Tarball — MongoDB Manual

MongoDB Community Editionのインストールページ全体は、こちら。

Install MongoDB Community Edition — MongoDB Manual

MongoDBをaptでインストールする

それでは、MongoDBをインストールしてみます。

まずは、公開鍵のインポート。

$ wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
OK

aptリポジトリを追加して

$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse

インデックスをアップデート。

$ sudo apt update

これで、パッケージがインストール可能になります。

$ sudo apt install mongodb-org

なにがインストールされるかというと、mongos、server、shell、toolsです。

The following additional packages will be installed:
  mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
The following NEW packages will be installed:
  mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools
0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.

mongodb-orgというのは、メタパッケージですね。

その他のパッケージの意味は、以下に記載があります。

MongoDB Community Edition Packages

  • mongodb-org-server … mongod daemon、関連するスクリプト、設定ファイルが含まれるパッケージです
  • mongodb-org-mongos … mongos daemonが含まれるパッケージです
  • mongodb-org-shell … mongoシェルが含まれるパッケージです
  • mongodb-org-tools … mongoimport、bsondump、mongodump、mongoexport、mongofiles、mongorestore、mongostat、mongotopが含まれるパッケージです

今回は、mongodb-orgでまるっとインストールします。

環境や起動停止に関する情報は、こちら。

Run MongoDB Community Edition

ディレクトリに関しては、以下のようになっています。

また、設定ファイルは「/etc/mongod.conf」にあります。

インストールされた、MongoDBのバージョンを確認。

$ mongod --version
db version v4.2.3
git version: 6874650b362138df74be53d366bbefc321ea32d4
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64

では、MongoDBを起動。

$ sudo systemctl start mongod

自動起動設定を有効に。

$ sudo systemctl enable mongod
Created symlink /etc/systemd/system/multi-user.target.wants/mongod.service → /lib/systemd/system/mongod.service.

停止。

$ sudo systemctl stop mongod

再起動。

$ sudo systemctl restart mongod

ログは、「/var/log/mongodb/mongod.log」ファイルを参照しましょう。

リッスンポートを確認。

$ sudo ss -tnlp
State           Recv-Q           Send-Q                      Local Address:Port                      Peer Address:Port                                                               
LISTEN          0                128                             127.0.0.1:27017                          0.0.0.0:*              users:(("mongod",pid=4671,fd=11))                   
LISTEN          0                128                         127.0.0.53%lo:53                             0.0.0.0:*              users:(("systemd-resolve",pid=690,fd=13))           
LISTEN          0                128                               0.0.0.0:22                             0.0.0.0:*              users:(("sshd",pid=1098,fd=3))                      
LISTEN          0                128                                  [::]:22                                [::]:*              users:(("sshd",pid=1098,fd=4)) 

27017ポートがMongoDBですね。ローカルからのみの接続許可になっています。

デフォルト設定を確認してみましょう。こんな感じです。

$ grep -vE '^#|^$' /etc/mongod.conf 
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
net:
  port: 27017
  bindIp: 127.0.0.1
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

「/etc/mongod.conf」の以下の部分を変更して

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

外部からの接続を許可してみましょう。

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

再起動。

$ sudo systemctl restart mongod

確認。

$ sudo ss -tnlp
State           Recv-Q           Send-Q                      Local Address:Port                      Peer Address:Port                                                               
LISTEN          0                128                               0.0.0.0:27017                          0.0.0.0:*              users:(("mongod",pid=4799,fd=11))                   
LISTEN          0                128                         127.0.0.53%lo:53                             0.0.0.0:*              users:(("systemd-resolve",pid=690,fd=13))           
LISTEN          0                128                               0.0.0.0:22                             0.0.0.0:*              users:(("sshd",pid=1098,fd=3))                      
LISTEN          0                128                                  [::]:22                                [::]:*              users:(("sshd",pid=1098,fd=4))

バインドされるアドレスが変更されましたね。

mongoシェルで動作確認

最後に、mongoシェルで動作確認してみます。

$ mongo

データベースの切り替え。

> use book
switched to db book

コレクションにデータの登録。

> db.book.insertMany([
... { isbn: "978-4873115900", title: "MongoDBイン・アクション", price: 2680 },
... { isbn: "978-4798045733", title: "RDB技術者のためのNoSQLガイド", price: 4059 },
... { isbn: "978-4777519620", title: "はじめてのMongoDB", price: 2530 }
... ])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5e63b16993eb04abd69b9931"),
        ObjectId("5e63b16993eb04abd69b9932"),
        ObjectId("5e63b16993eb04abd69b9933")
    ]
}

全件取得。

> db.book.find( { } )
{ "_id" : ObjectId("5e63b16993eb04abd69b9931"), "isbn" : "978-4873115900", "title" : "MongoDBイン・アクション", "price" : 2680 }
{ "_id" : ObjectId("5e63b16993eb04abd69b9932"), "isbn" : "978-4798045733", "title" : "RDB技術者のためのNoSQLガイド", "price" : 4059 }
{ "_id" : ObjectId("5e63b16993eb04abd69b9933"), "isbn" : "978-4777519620", "title" : "はじめてのMongoDB", "price" : 2530 }

3,000円以上のデータを取得。

> db.book.find( { price: { $gt: 3000 } } )
{ "_id" : ObjectId("5e63b16993eb04abd69b9932"), "isbn" : "978-4798045733", "title" : "RDB技術者のためのNoSQLガイド", "price" : 4059 }

タイトルに「NoSQL」を含み、かつ3,000円以上のデータを取得。

> db.book.find( { title: /NoSQL/, price: { $gt: 3000 } } )
{ "_id" : ObjectId("5e63b16993eb04abd69b9932"), "isbn" : "978-4798045733", "title" : "RDB技術者のためのNoSQLガイド", "price" : 4059 }

1件削除。

> db.book.deleteOne( { isbn: "978-4798045733" } )
{ "acknowledged" : true, "deletedCount" : 1 }

確認。

> db.book.find( { } )
{ "_id" : ObjectId("5e63b16993eb04abd69b9931"), "isbn" : "978-4873115900", "title" : "MongoDBイン・アクション", "price" : 2680 }
{ "_id" : ObjectId("5e63b16993eb04abd69b9933"), "isbn" : "978-4777519620", "title" : "はじめてのMongoDB", "price" : 2530 }

全件削除。

> db.book.remove( { } )
WriteResult({ "nRemoved" : 2 })

こんなところでしょうか。

mongoシェルに関してはチュートリアルを見つつやりましたが、

Getting Started — MongoDB Manual

リファレンスとしては、こちらですね。

mongo Shell Methods — MongoDB Manual