MongoDBをインストールするには

「7つのデータベース 7つの世界」第5章の学習のために、MongoDBをインストールします。

7つのデータベース 7つの世界

  • PotgreSQL
  • Riak
  • HBase
  • MongoDB
  • CouchDB
  • Neo4j
  • Redis
arrow-right

原著の発行は 2012/5/21 で、書籍で使ったMongoDBのバージョンは 1.6.2 です。(156ページの脚注、157ページのmongo shell起動メッセージより)

最新バージョンは 4.2.6 です。

Riak、HBaseのインストールは大変だったけど、
MongoDBのインストールは簡単だったよ

書籍中のコードが動くといいわね

インストール

Windows 10

arrow-right

ダウンロードページを表示して、
OS=Windows x64
Package=MSI
を選択して、ダウンロードしてください。

ダウンロードしたmsiファイルを開きます。

「I accept ...」にチェックを付けます。

Completeボタンをクリックします。

「Install MongoD as a Service」にチェックを付けます。mongodが自動起動サービスとして登録されます。

「Install MongoDB Compass」のチェックをはずします。チェックをつけてインストールしてもいいのですが、Compassのインストールに時間がかかります。

途中「FireFoxを終了してください」と表示されたので、FireFoxを終了しました。

インストールされた場所は、"C:\Program Files\MongoDB\Server\4.2\bin" でした。バージョンは4.2.6です。

> "C:\Program Files\MongoDB\Server\4.2\bin\mongo" --version
MongoDB shell version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
allocator: tcmalloc
modules: none
build environment:
    distmod: 2012plus
    distarch: x86_64
    target_arch: x86_64

> "C:\Program Files\MongoDB\Server\4.2\bin\mongod" --version
db version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
allocator: tcmalloc
modules: none
build environment:
    distmod: 2012plus
    distarch: x86_64
    target_arch: x86_64Code language: Bash (bash)

MongoDBサービススタート(コマンドプロンプトを管理者として実行)

> sc start MongoDBCode language: Bash (bash)

MongoDBサービスストップ(コマンドプロンプトを管理者として実行)

> sc stop MongoDBCode language: Bash (bash)

設定ファイルは、"C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg" です。拡張子は conf ではなく cfg です。

> type "C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg"
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: C:\Program Files\MongoDB\Server\4.2\data
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  C:\Program Files\MongoDB\Server\4.2\log\mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:Code language: Bash (bash)

データの場所は、"C:\Program Files\MongoDB\Server\4.2\data" です。

> dir "C:\Program Files\MongoDB\Server\4.2\data"
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は B68A-30EF です

 C:\Program Files\MongoDB\Server\4.2\data のディレクトリ

2020/05/08  11:59    <DIR>          .
2020/05/08  11:59    <DIR>          ..
2020/05/08  11:14            20,480 collection-0-3108540780963219096.wt
2020/05/08  11:15            36,864 collection-2-3108540780963219096.wt
2020/05/08  11:56            24,576 collection-4-3108540780963219096.wt
2020/05/08  12:00    <DIR>          diagnostic.data
2020/05/08  11:14            20,480 index-1-3108540780963219096.wt
2020/05/08  11:15            36,864 index-3-3108540780963219096.wt
2020/05/08  11:56            24,576 index-5-3108540780963219096.wt
2020/05/08  11:58            12,288 index-6-3108540780963219096.wt
2020/05/08  11:14    <DIR>          journal
2020/05/08  11:14                 6 mongod.lock
2020/05/08  11:57            36,864 sizeStorer.wt
2020/05/08  11:11               114 storage.bson
2020/05/08  11:11                46 WiredTiger
2020/05/08  11:11                21 WiredTiger.lock
2020/05/08  11:59             1,250 WiredTiger.turtle
2020/05/08  11:59            61,440 WiredTiger.wt
2020/05/08  11:14             4,096 WiredTigerLAS.wt
2020/05/08  11:14            20,480 _mdb_catalog.wt
              16 個のファイル             300,445 バイト
               4 個のディレクトリ  143,801,733,120 バイトの空き領域Code language: Bash (bash)

環境変数Path

ユーザー環境変数Pathに「C:\Program Files\MongoDB\Server\4.2\bin」を挿入しておくと、mongoだけで実行できます。

(1)検索バーで「システム環境変数」を検索して、「システム環境変数の編集」を起動します。「環境変数」ボタンをクリックします。

(2)環境変数ダイアログが表示されます。「Path」を選択して、「編集」ボタンをクリックします。

(3)ユーザー変数の編集ダイアログが表示されます。編集前の値をコピペして、テキストエディタで保存しておきます。

編集前の値の先頭に「C:\Program Files\MongoDB\Server\4.2\bin;」を挿入します。binの後ろにセミコロンをつけてください。

PathPathの値
編集前の例%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
編集後の例C:\Program Files\MongoDB\Server\4.2\bin;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

コマンドプロンプトを閉じて、再度コマンドプロンプトを開いて、mongo --versionを実行してみてください。

> mongo --version
MongoDB shell version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
allocator: tcmalloc
modules: none
build environment:
    distmod: 2012plus
    distarch: x86_64
    target_arch: x86_64Code language: Bash (bash)

Mac OS X

arrow-right

Homebrew でインストールできます。パッケージ名は「mongodb-community@4.2」です。

$ brew tap mongodb/brew

$ brew install mongodb-community@4.2Code language: Bash (bash)

バージョンは、4.2.6でした。

$ mongo --version
MongoDB shell version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

$ mongod --version
db version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64Code language: Bash (bash)

mongodスタート

$ brew services start mongodb-community@4.2Code language: Bash (bash)

mongodストップ

$ brew services stop mongodb-community@4.2Code language: Bash (bash)

設定ファイルは、/usr/local/etc/mongod.conf です。

$ cat /usr/local/etc/mongod.conf
systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1
Code language: Bash (bash)

データの場所は、/usr/local/var/mongodb/ です。

$ ls -al /usr/local/var/mongodb/
total 648
drwxr-xr-x  22 aoki.makoto  admin    704  5  7 19:03 .
drwxrwxr-x  11 aoki.makoto  admin    352  5  7 18:53 ..
-rw-------   1 aoki.makoto  admin     46  5  7 18:54 WiredTiger
-rw-------   1 aoki.makoto  admin     21  5  7 18:54 WiredTiger.lock
-rw-------   1 aoki.makoto  admin   1249  5  7 19:03 WiredTiger.turtle
-rw-------   1 aoki.makoto  admin  61440  5  7 19:03 WiredTiger.wt
-rw-------   1 aoki.makoto  admin   4096  5  7 19:03 WiredTigerLAS.wt
-rw-------   1 aoki.makoto  admin  36864  5  7 19:03 _mdb_catalog.wt
-rw-------   1 aoki.makoto  admin  20480  5  7 19:03 collection-0--54388837473210117.wt
-rw-------   1 aoki.makoto  admin  20480  5  7 19:03 collection-0-1944324710744862371.wt
-rw-------   1 aoki.makoto  admin  36864  5  7 19:03 collection-2--54388837473210117.wt
-rw-------   1 aoki.makoto  admin   4096  5  7 18:56 collection-4--54388837473210117.wt
drwx------   4 aoki.makoto  admin    128  5  7 19:03 diagnostic.data
-rw-------   1 aoki.makoto  admin  20480  5  7 19:03 index-1--54388837473210117.wt
-rw-------   1 aoki.makoto  admin  20480  5  7 19:03 index-1-1944324710744862371.wt
-rw-------   1 aoki.makoto  admin  36864  5  7 19:03 index-3--54388837473210117.wt
-rw-------   1 aoki.makoto  admin   4096  5  7 19:03 index-5--54388837473210117.wt
-rw-------   1 aoki.makoto  admin  12288  5  7 19:03 index-6--54388837473210117.wt
drwx------   5 aoki.makoto  admin    160  5  7 18:56 journal
-rw-------   1 aoki.makoto  admin      0  5  7 19:03 mongod.lock
-rw-------   1 aoki.makoto  admin  36864  5  7 19:03 sizeStorer.wt
-rw-------   1 aoki.makoto  admin    114  5  7 18:54 storage.bsonCode language: Bash (bash)

各コマンドの本体は、/usr/local/Cellar/mongodb-community/4.2.6/bin/ にありました。

$ which mongo
/usr/local/bin/mongo

$ ls -al /usr/local/bin/mongo
lrwxr-xr-x  1 aoki.makoto  admin  43  5  7 18:53 /usr/local/bin/mongo -> ../Cellar/mongodb-community/4.2.6/bin/mongo

$ ls -al /usr/local/Cellar/mongodb-community/4.2.6/bin
total 626544
drwxr-xr-x  15 aoki.makoto  admin       480  5  7 18:53 .
drwxr-xr-x  11 aoki.makoto  admin       352  5  7 18:53 ..
-r-xr-xr-x   1 aoki.makoto  admin  13190252  4 17 12:11 bsondump
-r-xr-xr-x   1 aoki.makoto  admin      7693  4 17 12:26 install_compass
-r-xr-xr-x   1 aoki.makoto  admin  47455304  4 17 12:16 mongo
-r-xr-xr-x   1 aoki.makoto  admin  74424388  4 17 12:26 mongod
-r-xr-xr-x   1 aoki.makoto  admin  18668452  4 17 12:11 mongodump
-r-xr-xr-x   1 aoki.makoto  admin  18359580  4 17 12:11 mongoexport
-r-xr-xr-x   1 aoki.makoto  admin  18325828  4 17 12:11 mongofiles
-r-xr-xr-x   1 aoki.makoto  admin  18563020  4 17 12:11 mongoimport
-r-xr-xr-x   1 aoki.makoto  admin  17630172  4 17 12:11 mongoreplay
-r-xr-xr-x   1 aoki.makoto  admin  19036460  4 17 12:11 mongorestore
-r-xr-xr-x   1 aoki.makoto  admin  39291660  4 17 12:20 mongos
-r-xr-xr-x   1 aoki.makoto  admin  18096140  4 17 12:11 mongostat
-r-xr-xr-x   1 aoki.makoto  admin  17715188  4 17 12:11 mongotop
Code language: Bash (bash)

Ubuntu 18.04

arrow-right

MongoDBのGPGキーをインポートします。

$ wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -Code language: Bash (bash)

MongoDBのapt listを作成します。

$ 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

$ sudo apt updateCode language: Bash (bash)

「mongodb-org」をインストールします。

$ sudo apt install mongodb-orgCode language: Bash (bash)
Package NameDescription
mongodb-org以下のパッケージをインストールします。
mongodb-org-servermongod
mongodb-org-mongosmongos
mongodb-org-shellmongo
mongodb-org-toolsmongodump
bsondump
mongoimport
mongoexport
mongostat
mongotop
mongofiles
install_compass

バージョンは、4.2.6でした。

$ which mongo
/usr/bin/mongo

$ mongo --version
MongoDB shell version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64

$ mongod --version
db version v4.2.6
git version: 20364840b8f1af16917e4c23c1b5f5efd8b352f8
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
allocator: tcmalloc
modules: none
build environment:
    distmod: ubuntu1804
    distarch: x86_64
    target_arch: x86_64Code language: Bash (bash)

スタート

$ sudo systemctl daemon-reload
$ sudo service mongod startCode language: Bash (bash)

ストップ

$ sudo service mongod stopCode language: Bash (bash)

設定ファイルは、/etc/mongod.conf です。

$ cat /etc/mongod.conf
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:
Code language: Bash (bash)

データの場所は、/var/lib/mongodb/ です。

$ ls -al /var/lib/mongodb/
合計 280
drwxr-xr-x  4 mongodb mongodb  4096  5月  7 20:02 .
drwxr-xr-x 77 root    root     4096  5月  7 20:01 ..
-rw-------  1 mongodb mongodb    46  5月  7 20:01 WiredTiger
-rw-------  1 mongodb mongodb    21  5月  7 20:01 WiredTiger.lock
-rw-------  1 mongodb mongodb  1246  5月  7 20:02 WiredTiger.turtle
-rw-------  1 mongodb mongodb 61440  5月  7 20:02 WiredTiger.wt
-rw-------  1 mongodb mongodb  4096  5月  7 20:02 WiredTigerLAS.wt
-rw-------  1 mongodb mongodb 20480  5月  7 20:02 _mdb_catalog.wt
-rw-------  1 mongodb mongodb 20480  5月  7 20:02 collection-0--1106797949873816583.wt
-rw-------  1 mongodb mongodb 36864  5月  7 20:02 collection-2--1106797949873816583.wt
-rw-------  1 mongodb mongodb  4096  5月  7 20:01 collection-4--1106797949873816583.wt
drwx------  2 mongodb mongodb  4096  5月  7 20:02 diagnostic.data
-rw-------  1 mongodb mongodb 20480  5月  7 20:02 index-1--1106797949873816583.wt
-rw-------  1 mongodb mongodb 36864  5月  7 20:02 index-3--1106797949873816583.wt
-rw-------  1 mongodb mongodb  4096  5月  7 20:01 index-5--1106797949873816583.wt
-rw-------  1 mongodb mongodb  8192  5月  7 20:01 index-6--1106797949873816583.wt
drwx------  2 mongodb mongodb  4096  5月  7 20:01 journal
-rw-------  1 mongodb mongodb     0  5月  7 20:02 mongod.lock
-rw-------  1 mongodb mongodb 36864  5月  7 20:02 sizeStorer.wt
-rw-------  1 mongodb mongodb   114  5月  7 20:01 storage.bson
Code language: Bash (bash)

書籍内のコードについて

p144 explain()の結果

explainの結果が全く違うんだけど...

バージョンによって違うのはしょうがないわね

書籍の、index作成前のexplainは

{
  "cursor": "BasicCurosr",
  "nscanned", 109999,
  "millis", 52,Code language: JSON / JSON with Comments (json)

書籍の、index作成後のexplainは

{
  "cursor": "BtreeCurosr display_1",
  "nscanned", 1,
  "millis", 0,Code language: JSON / JSON with Comments (json)

4.2.6での、index作成前のexplainは

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "COLLSCAN",
      "filter": {
        "display": {
          "$eq": "+5 800-5649999"
Code language: JSON / JSON with Comments (json)

4.2.6での、index作成後のexplainは

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": {
          "display": 1
        },
        "indexName": "display_1",
        "isMultiKey": false,
        "multiKeyPaths": {
          "display": []
        },
        "isUnique": true,
        "isSparse": false,
        "isPartial": false,
        "indexVersion": 2,
        "direction": "forward",
          "indexBounds": {
          "display": [
            "[\"+5 800-5649999\", \"+5 800-5649999\"]"
          ]
        }
      }
Code language: JSON / JSON with Comments (json)

4.2.6でのexplain結果はフィールド構成から違います。

調べると、MongoDB 3.0 で、explain()のフォーマットが変更されました。

(Google翻訳)
クエリプランナーがコレクションスキャンを選択した場合、Explain結果にはCOLLSCANステージが含まれます。

クエリプランナーがインデックスを選択した場合、Explain結果にはIXSCANステージが含まれ ます。ステージには、インデックスキーパターン、走査方向、インデックス境界などの情報が含まれます。

Explain Results, 3.0 Format Change

3.0以降は、コレクションスキャンの場合、"stage": "COLLSCAN"、インデックススキャンの場合、"stage": "IXSCAN" と表示されるようになりました。

4.2.6のexplain結果はどう見ればいいのかな

それをふまえて見ると、4.2.6のindex作成前のexplain結果には「"stage": "COLLSCAN"」がありますね。インデックスを使わない、コレクションスキャンをしています。

4.2.6のindex作成後のexplain結果には「"stage": "IXSCAN"」と「"indexName": "display_1"」とあります。インデックス display_1 を使ったインデックススキャンをしています。

p146 db.collections.group()

4.2.6には、group()はありませんでした。代わりに、aggregate()を使います。

arrow-right
arrow-right

p147の1つめの例

db.phones.group({
    initial: { count: 0 }, 
    reduce: function (phone, output) { coutput.count += 1; },
    cond: { 'components.number': { $gt: 5599999 } },
    key:  { 'components.area': true }
})Code language: JavaScript (javascript)

aggregateを使った例

db.phones.aggregate([
{
    $match: {
        'components.number': {
            $gt: 5599999
        }
    }
},
{
    $group: {
        _id: '$components.area',
        count: {
            $sum: 1
        }
    }
}
])


{ "_id" : 800, "count" : 50000 }
{ "_id" : 855, "count" : 50000 }Code language: JavaScript (javascript)

p147の2つめの例

db.phones.group({
    initial: { count: 0 }, 
    reduce: function (phone, output) { coutput.count += 1; },
    cond: { 'components.number': { $gt: 5599999 } }
})Code language: JavaScript (javascript)

aggregateを使った例

db.phones.aggregate([
{
    $match: {
        'components.number': {
            $gt: 5599999
        }
    }
},
{
    $group: {
        _id: null,
        count: {
            $sum: 1
        }
    }
}
])

{ "_id" : null, "count" : 100000 }Code language: JavaScript (javascript)

p148 サーバーサイドコマンド

4.2以降、db.eval()関数はなくなりました。

version 4.2からevalコマンドを削除しました。

https://docs.mongodb.com/manual/reference/method/db.eval/

p149 db.phones.countのjsソースは、4.2.6では大きく変わっていて、db.phones.find().count を呼んでいませんでした。

> db.phones.count
function(query, options) {
    query = this.find(query);

    // Apply options and return the result of the find
    return QueryHelpers._applyCountOptions(query, options).count(true);
}Code language: JavaScript (javascript)

p150では、db.system.js.save()を呼んでいますが、4.2.6では、db.sysdb.phones.find().countのjsソースも違っています。います。からはrunCommnadを呼んでいませんでした。

p155 レプリカセット

mongod起動時のrestオプションは3.6で廃止されました。

MongoDB 3.6 removes the deprecated HTTP interface and REST API to MongoDB.

Configuration(/etc/mongo.conf)
net.http.enabled
net.http.JSONPEnabled
net.http.port
net.http.RESTInterfaceEnabled

mongod/mongos option
httpinterface
nohttpinterface
jsonp
rest

Compatibility Changes in MongoDB 3.6

p158 シャーディング

シャーディングサーバ、コンフィグサーバ、どちらもレプリカセットの必要があります。幸いにも、1台だけのレプリカセットを設定できます。

ターミナル1

$ mongod --shardsvr --replSet shard1 --dbpath ./mongo4 --port 27014Code language: Bash (bash)

ターミナル2

$ mongod localhost:27014

> rs.initiate()Code language: Bash (bash)

ターミナル3

$ mongod --shardsvr --replSet shard1 --dbpath ./mongo5 --port 27015Code language: Bash (bash)

ターミナル4

$ mongod localhost:27015

> rs.initiate()Code language: Bash (bash)

ターミナル5

$ mongod --configsvr --replSet config --dbpath ./mongoconfig  --port 27016Code language: Bash (bash)

ターミナル6

$ mongod localhost:27016

> rs.initiate()Code language: Bash (bash)

ターミナル7

$ mongos --configdb config/localhost:27016  --port 27020Code language: Bash (bash)

ターミナル8

$ mongo localhost:27020/admin

> sh.addShard("shard1/localhost:27014")
> sh.addShard("shard2/localhost:27015")
> sh.enableSharding("test")
> sh.shardCollection("test.cities", {name: 1})
> exit

$ mongo  localhost:27020/test  mongo_cities1000.jsCode language: Bash (bash)

デフォルトchunksizeは64Mで、64Mバイトを超えるデータを挿入すると、複数のシャードに分けて保存するようです。残念ながら、mongo_cities1000.js は、12Mバイトで、複数シャードには分かれませんでした。

参考記事

MongoDB Shardingを簡単に体験してみる - Qiita
概要ShardingはShardキーの値によってデータを格納するShardを決定して分散化を図ります。以下のURLに古い資料ですが、日立がShardingの性能評価をした資料(PDF)があります…
タイトルとURLをコピーしました