概要

  • スキーマレスであるドキュメント指向データべースであること
  • スケーラビリティに関する機能を標準機能として備えていること
  • 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.
  • mongodb-org-mongos
    • This package contains the mongos daemon.
  • mongodb-org-shell
    • This package contains the mongo shell.
  • 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 is the port configured in /etc/mongod.conf, 27017 by default.

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

  • https://ja.wikipedia.org/wiki/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 / 範囲検索 | &gt(greater than), &lt(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との違い。
  • 保存容量が指定した容量より大きくなると、古いデータから上書きする。

参考

results matching ""

    No results matching ""