概要
- スキーマレスであるドキュメント指向データべースであること
- スケーラビリティに関する機能を標準機能として備えていること
- RDBと比較してRead/Writeの性能が高い
- 開発のしやすさ
Install
Mac(OSX) Install
https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/
brew update
brew install mongodb
brew install mongodb --with-openssl
Auto Start setting
https://gist.github.com/tonypujals/9630872
Set up launchctl to auto start mongod
$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
/usr/local/opt/mongodb/ is a symlink to /usr/local/Cellar/mongodb/x.y.z (e.g., 2.4.9)
You can use launchctl to start and stop mongod
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
You can also more conveniently use brew to start, stop, and verify service status
$ brew services list | grep mongodb
$ brew services start mongodb
$ brew services stop mongodb
centOS Install
最新versionのmongoをinstallするために .repo fileを設定する
/etc/yum.repos.d/mongodb-org-3.2.repo
を作成
なかみ
[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
以下のように3.2が出ればOK
sudo yum list | grep mongo
mongodb-org.x86_64 3.2.8-1.el7 mongodb-org-3.2
mongodb-org-mongos.x86_64 3.2.8-1.el7 mongodb-org-3.2
mongodb-org-server.x86_64 3.2.8-1.el7 mongodb-org-3.2
mongodb-org-shell.x86_64 3.2.8-1.el7 mongodb-org-3.2
mongodb-org-tools.x86_64 3.2.8-1.el7 mongodb-org-3.2
packageについて
- mongodb-org
- This package is a metapackage that will automatically install the + four component packages listed below.
- mongodb-org-server
- This package contains the
mongod
daemon and associated configuration and init scripts.
- This package contains the
- mongodb-org-mongos
- This package contains the
mongos
daemon.
- This package contains the
- mongodb-org-shell
- This package contains the
mongo
shell.
- This package contains the
- mongodb-org-tools
- This package contains the following MongoDB tools: mongoimport bsondump, mongodump, mongoexport, mongofiles, mongooplog, mongoperf, mongorestore, mongostat, and mongotop.
install
sudo yum install -y mongodb-org
# 特定releaseをinstallする場合
sudo yum install -y mongodb-org-3.2.8 mongodb-org-server-3.2.8 mongodb-org-shell-3.2.8 mongodb-org-mongos-3.2.8 mongodb-org-tools-3.2.8
clientだけ必要な場合には(mongo commandを使いたい)
sudo yum install -y mongodb-org-shell
start mongodb
sudo service mongod start
Verify that MongoDB has started successfully
/var/log/mongodb/mongod.log
[initandlisten] waiting for connections on port <port>
where
reboot時の自動start
sudo chkconfig mongod on
stop & restart
sudo service mongod stop
sudo service mongod restart
config file
/usr/local/etc/mongod.conf
Database settings & server run
default port
/etc/mongod.conf, 27017 by default
/data/dbをdefaultで利用する
mkdir -p /data/db
read権限付与
sudo chown -R your:user data/
server run
mongod
server run with dbpath
mongod --dbpath /Your-Mongodb-data-path/mongodb/mongodb-in-action
console run
mongo
version確認
mongo -version
認証
How to start MongoDB automatically when starting your Mac OS X
/Library/LaunchDaemons/
へorg.mongo.mongod.plist
をつくることでできる
sudo emacs /Library/LaunchDaemons/org.mongo.mongod.plist
- dbpathは修正すること
- logpathは修正すること
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.mongo.mongod</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/mongod</string>
<string>--dbpath</string>
<string>/var/lib/mongodb/</string>
<string>--logpath</string>
<string>/var/log/mongodb.log</string>
</array>
</dict>
</plist>
run this
sudo chown root:wheel /Library/LaunchDaemons/org.mongo.mongod.plist
sudo launchctl load /Library/LaunchDaemons/org.mongo.mongod.plist
sudo launchctl start org.mongo.mongod
Mongodb basics
BSON
BSONは主にMongoDBのデータストレージ及びネットワーク転送フォーマットとして利用されているデータ交換フォーマットである。
- 単純なデータ構造や連想配列(MongoDBではオブジェクトまたはドキュメントと表す)を示すバイナリ構造であり、
- 名称はJSON由来であり"バイナリ型JSON"の略語である
ID
12 byte
4c291856 238d3b 19b2 00001
4byte time stamp | server id | process id | counter
- 4byte time stamp : unix epoch(에폭)が始まってから何秒がすぎているか
スキーマ設計
- データの基本単位は
データをどうやってクエリしてアップデートするか?
object-relationのマッピングツールの依存が他のRDBMSに比べひくい。
slug
documentに対するURLを生成するときには slugを作ることをおすすめする
https://www.ec_test.com/products/wheel-barrow-9092
index生成する
db.products.ensureIndex({slug: 1}, {unique: true})
sample document example
doc =
{
_id: new ObjectId("123iouh3iu12hg231ug321u"),
slug: "whel-barrow-9092",
name: "name...",
description: "description..",
details: {
weight: 47,
color
},
pricing: {
reatail:50000,
sale: 4000,
},
price_history: [
{ retail: 5000,
sale: 4000,
start: new Date(2010,4,1),
end: new Date(2010,4,8)
},
{ retail: 5000,
sale: 5000,
start: new Date(2010,4,9),
end: new Date(2010,4,16)
},
],
category_ids: [ new ObjectId("63432ijfiejfiejf34343"), new ObjectId("63432ijfiejfiejf34343")],
mail_cat_id: new ObjectId("6aieifjeofijowjef"),
tags: ["tools", "gardening", "soil"]
}
shard
- Horizontally Scalable
直感的なデータ・モデル
ECの場合 糸つの注文のデータを作るため、複数のテーブルをJOINする必要がある。
MongoDBは一つのdocumentで表現できる
スキーマがない
pros アプリケーションががデータ構造を決める。
secondary index
一つのcollectionに64個までセカンデリインデックスを生成できる
replication
database
use tutorial
- databaseを生成しなくてもいい
- database collectionはdocumentが最初にinsertされるときに生成される。
- strictモードにすると自動生成されない
mongo shell methods | cli commands
データベース一覧を表示する
show dbs
> show dbs
admin (empty)
local 0.078GB
test 0.078GB
totorial (empty)
tutorial 0.078GB
db 選択
use db_name
db削除
削除するDBへ移動したあと削除
use db_name
db.dropDatabase()
現在選択しているデータベースを表示する
db
コレクションリスト
show collections
> show collections # または show tables
numbers
system.indexes
testData
users
db.collection.insert()
> db.users.insert({username: "seo"})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("544872fbbd0594d24077a874"), "username" : "seo" }
db.collection.update()
# set
> db.users.update({username: "seo"}, {$set :{country: "Janpan"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({username: "seo"})
{ "_id" : ObjectId("5448744a7aab27581ab00b8b"), "username" : "seo", "country" : "Janpan" }
# unset
> db.users.update({username: 'seo'}, {$unset :{country: 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({username: "seo"})
{ "_id" : ObjectId("5448744a7aab27581ab00b8b"), "username" : "seo" }
# 追加
db.users.update({username: "seo"},
{$set: {favorites:
{
cities: ["tokyo", "osaka"],
movies: ["tokyo moive", "osaka movie"]
}
}
})
db.collection.save() & db.collection.count()
> db.users.save({username: "bang"})
WriteResult({ "nInserted" : 1 })
> db.users.count()
> 2
参照系
// select * from collection
db.collection.find()
// select * from collection where x=4
db.collection.find({x:4})
// select j from collection where x=4
db.collection.find({x:4}, {j:1})
// select * from collection limit 1
db.collection.findOne()
// select * from collection where x > 1
db.collection.find({x : {$gt: 1}})
// select * from collection where x < 3 and x > 1
db.collection.find({x : {$gt: 1, $lt: 3}})
// select * from collection limit 3
db.collection.find().limit(3);
// join的な事も可能
// select * from collection1 inner join collection2 on x = x
p = db.collection1.findOne({x:1});
db.collection2.findOne( { _id : p.x } )
// select * from collection order by x desc
db.collection.find().sort({x:-1});
// select count(*) from collection
db.collection.find({x:1}).count();
// explan select * from collection where x = 1
db.collection.find({x:1}).explain();
db.collection.find()
basic
db.users.find({username: "bang"})
IN
商品が属しているカテゴリーを探す
db.categories.find({_id: {$in: product['category_ids']})
like検索
findと正規表現をつかう
db.users.find({"email": /hoge10/})
findとfindOne
find
はreferenceを
findOne
は値をreturnする
find by field
idとpasswordでuserを検索する場合
db.users.findOne({ username: 'kbanker', hashed_password: 'xxxxxxxxxxxxxxxx'})
paging / skip , limit
db.reviews.find({ 'product_id': product['id'] }).skip(0).limit(12)
range search / 範囲検索 | >(greater than), <(less than)
db.numbers.find({num : {$gt: 199995}})
db.numbers.find({num : {$gt: 20, $lt: 25}})
collection
sample collection 生成
for(var i=0; i < 200000; i++) {
db.numbers.save({num: i});
}
for (var i = 1; i <= 25; i++) {
db.testData.insert( { x : i } )
}
sample collection 生成 確認
db.numbers.count()
db.numbers.find()
collection 生成
db.createCollection("users")
db.collection.drop() | collection 削除
Removes a collection from the database
documentの削除はdb.colllection.remove()を利用
db.categories.drop()
collection rename
db.products.renameCollection("store_products")
collectの詳細情報 / 空間の確認
db.stats()
> db.stats()
{
"db" : "test",
"collections" : 5,
"objects" : 200037,
"avgObjSize" : 48.001759674460224,
"dataSize" : 9602128,
"storageSize" : 22540288,
"numExtents" : 11,
"indexes" : 4,
"indexSize" : 11569040,
"fileSize" : 67108864,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 0,
"totalSize" : 0
},
"ok" : 1
}
collectionに対してのstats()
db.numbers.stats()
index
https://docs.mongodb.org/manual/indexes/
explain
5件を探すため 200000件がscanされた。 実際にdocumentにデータが多かったらもっと時間がかかるようになる
> db.numbers.find({num : {$gt: 199995}}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 4,
"nscannedObjects" : 200000,
"nscanned" : 200000,
"nscannedObjectsAllPlans" : 200000,
"nscannedAllPlans" : 200000,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 1562,
"nChunkSkips" : 0,
"millis" : 62,
"server" : "i010c71303S05m.local:27017",
"filterSet" : false
}
index生成
> db.numbers.ensureIndex({num :1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
index確認
2つのindexがある。 一つは自動的にid index 2つ目が生成したindex
> db.numbers.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.numbers"
},
{
"v" : 1,
"key" : {
"num" : 1
},
"name" : "num_1",
"ns" : "test.numbers"
}
]
> db.numbers.find({num : {$gt: 199995}}).explain()
{
"cursor" : "BtreeCursor num_1",
"isMultiKey" : false,
"n" : 4,
"nscannedObjects" : 4,
"nscanned" : 4,
"nscannedObjectsAllPlans" : 4,
"nscannedAllPlans" : 4,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"num" : [
[
199995,
Infinity
]
]
},
"server" : "i010c71303S05m.local:27017",
"filterSet" : false
}
data file
collectionにデータを書き込んでからdata failが生成される
$cd dbpath
$ls -alh
total 589832
0 drwxr-xr-x 9 306B 3 29 01:06 ./
0 drwxr-xr-x 3 102B 3 26 02:07 ../
0 drwxr-xr-x 4 136B 4 8 01:41 journal/
131072 -rw------- 1 64M 4 8 01:43 local.0
32768 -rw------- 1 16M 4 8 01:43 local.ns
8 -rwxr-xr-x 1 5B 4 8 01:41 mongod.lock*
131072 -rw------- 1 64M 3 26 02:21 twitter-archive.0
262144 -rw------- 1 128M 3 26 02:21 twitter-archive.1
32768 -rw------- 1 16M 3 26 02:21 twitter-archive.ns
drop data file
@connection.drop_database('garden')
data fail内容
mongod.lock
: サーバーのprocess IDを保存local.ns
: nsはnamespaceを意味- default 16MBで 24,000個のnamespaceを保存
空間の確認
db.stats()
キーの長さ
RDBMSはキーを保存してないので、容量には影響がないが、 mongodbではdocumentのキーも保存するので、短いキー名がいい。
capped collection
- 高性能とロギング機能のため
- 固定のサイズをもつことか一般的なcollectionとの違い。
- 保存容量が指定した容量より大きくなると、古いデータから上書きする。