「7つのデータベース 7つの世界」第5章の学習のために、MongoDBをインストールします。
7つのデータベース 7つの世界
- PotgreSQL
- Riak
- HBase
- MongoDB
- CouchDB
- Neo4j
- Redis
原著の発行は 2012/5/21 で、書籍で使ったMongoDBのバージョンは 1.6.2 です。(156ページの脚注、157ページのmongo shell起動メッセージより)
最新バージョンは 4.2.6 です。
Riak、HBaseのインストールは大変だったけど、
MongoDBのインストールは簡単だったよ
書籍中のコードが動くといいわね
インストール
Windows 10
ダウンロードページを表示して、
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_64
Code language: Bash (bash)
MongoDBサービススタート(コマンドプロンプトを管理者として実行)
> sc start MongoDB
Code language: Bash (bash)
MongoDBサービスストップ(コマンドプロンプトを管理者として実行)
> sc stop MongoDB
Code 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の後ろにセミコロンをつけてください。
Path | Pathの値 |
---|---|
編集前の例 | %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_64
Code language: Bash (bash)
Mac OS X
Homebrew でインストールできます。パッケージ名は「mongodb-community@4.2」です。
$ brew tap mongodb/brew
$ brew install mongodb-community@4.2
Code 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_64
Code language: Bash (bash)
mongodスタート
$ brew services start mongodb-community@4.2
Code language: Bash (bash)
mongodストップ
$ brew services stop mongodb-community@4.2
Code 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.bson
Code 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
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 update
Code language: Bash (bash)
「mongodb-org」をインストールします。
$ sudo apt install mongodb-org
Code language: Bash (bash)
Package Name | Description |
---|---|
mongodb-org | 以下のパッケージをインストールします。 |
mongodb-org-server | mongod |
mongodb-org-mongos | mongos |
mongodb-org-shell | mongo |
mongodb-org-tools | mongodump 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_64
Code language: Bash (bash)
スタート
$ sudo systemctl daemon-reload
$ sudo service mongod start
Code language: Bash (bash)
ストップ
$ sudo service mongod stop
Code 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 Results, 3.0 Format Change
クエリプランナーがコレクションスキャンを選択した場合、Explain結果にはCOLLSCANステージが含まれます。
クエリプランナーがインデックスを選択した場合、Explain結果にはIXSCANステージが含まれ ます。ステージには、インデックスキーパターン、走査方向、インデックス境界などの情報が含まれます。
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()を使います。
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.
Compatibility Changes in MongoDB 3.6Configuration(/etc/mongo.conf)
net.http.enabled
net.http.JSONPEnabled
net.http.port
net.http.RESTInterfaceEnabled
mongod/mongos option
httpinterface
nohttpinterface
jsonp
rest
p158 シャーディング
シャーディングサーバ、コンフィグサーバ、どちらもレプリカセットの必要があります。幸いにも、1台だけのレプリカセットを設定できます。
ターミナル1
$ mongod --shardsvr --replSet shard1 --dbpath ./mongo4 --port 27014
Code language: Bash (bash)
ターミナル2
$ mongod localhost:27014
> rs.initiate()
Code language: Bash (bash)
ターミナル3
$ mongod --shardsvr --replSet shard1 --dbpath ./mongo5 --port 27015
Code language: Bash (bash)
ターミナル4
$ mongod localhost:27015
> rs.initiate()
Code language: Bash (bash)
ターミナル5
$ mongod --configsvr --replSet config --dbpath ./mongoconfig --port 27016
Code language: Bash (bash)
ターミナル6
$ mongod localhost:27016
> rs.initiate()
Code language: Bash (bash)
ターミナル7
$ mongos --configdb config/localhost:27016 --port 27020
Code 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.js
Code language: Bash (bash)
デフォルトchunksizeは64Mで、64Mバイトを超えるデータを挿入すると、複数のシャードに分けて保存するようです。残念ながら、mongo_cities1000.js は、12Mバイトで、複数シャードには分かれませんでした。
参考記事