読者です 読者をやめる 読者になる 読者になる

Bonkura - Kenny

SIerで働く文系SEの記録

【mongoDB】mongoDBの基礎知識と、初めて使い始めるまで

mongoDB

mongoDBに触った事が殆どなかったので、少し勉強してみました。

mongoDBとは?

ドキュメント志向データベースの代表格。NoSQL(SQLを使わないデータベース)の高パフォーマンス/スケーラビリティを保持しつつ、RDBライクな機能をバランスよく組み込む事を目指して開発された。MySQLOracleなどのRDBの主な違いは、 トランザクションとリレーショナル(JOIN)は実装されていない、デッドロックについて考えない など。RDBライクな機能の組み込みとして、where,likeを使った複雑な検索をできる。

特徴

  • スキーマレスなドキュメント指向データベース。(ドキュメント(RDBでいう、レコード)は、共通の構造(カラムやスキーマ)を持つ必要がない。じゃあどうするのかというと、JSON形式でデータが格納される。)
  • スキーマレスなので、予めデータの形式を決めておく必要がない。
  • RDBと比較してRead/Writeの性能が高い。

用語

  • データベース:RDBで言うと、データベース
  • コレクション:RDBで言うと、テーブル
  • ドキュメント:RDBで言うと、レコード
  • field:Key-ValueのKey
  • val:Key-ValueのValue

インストール(CentOS6.7 64bit)

mongoDBの公式サイトの"installation"を参考にインストール

sudo vim /etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
sudo yum install mongo-10gen mongo-10gen-server
sudo service mongod start
sudo chkconfig mongod on

データベースの操作

基本的なmongoDBの使い方をまとめました。

###### データベース操作 ######
# コマンドリスト表示
> help

# mong-shellから抜ける
> exit

# データベース参照
> show dbs

# データベース選択
# データベースはコレクションを作るまで存在しないことになっている事に注意。
> use mydb

# データベース削除
> db.dropDatabase()

####### コレクション操作 #######
# コレクション一覧参照
> show collections

# コレクション作成
> db.createCollection("users");

# コレクションのメタ情報参照
> db.stats();

###### ドキュメント操作 ######
# 全ドキュメントの参照
> db.users.find()
# 全ドキュメントの削除
> db.users.remove({});

### ドキュメントの挿入 ###
# INSERT
> db.users.insert({ name: "hoge",score: 10 })
> db.users.insert({ name: "fuga",score: 10,tags:["web","mobile"]});

# JavaScriptを使用することができる。
# ※コレクションはドキュメントをinsertすると自動的に作られる。
> for (var 1 = 0; i < 10; i++) { db.users.insert({ score: Math.random() }); }


### ドキュメントの参照 ###
> db.users.find({team: "A"})
> db.users.find({score: {$gte: 20}})
# $gte greater than equal
# $gt greater than
# $lte less than equal
# $lt less than
# $eq equal
# $ne not equal

## 検索条件 ##
# AND
> db.users.find({name: /o/, score:{$gte:20}});
# or
> db.users.find({$or: [{name: /o/},{score:{$gte:20}}]});

# 正規表現を用いる事も出来る
> db.users.find({name: "/o/"})

#挿入されているデータの種類を確認
> db.users.distinct("team")

# select * from count();
> db.users.count();

# そのスキーマが存在するかどうか?
> db.users.find({age: {$exists: true}})
> db.users.find({age: {$exists: false}})

## 表示するフィールドを指定 ##
# true,falseを混在させる事は不可。(_idを除く)
> db.users.find({},{name: true,score:true});

# _id列を除いて参照する。
> db.users.find({},{_id: 0});

# sortする
> db.users.find({},{_id: 0}).sort({score: 1});
> db.users.find({},{_id: 0}).sort({score: -1});

# 参照するドキュメント数を指定(LIMIT)
> db.users.find({},{_id: 0}).sort({score: -1}).limit(1);
> db.users.findOne({},{_id: 0}).sort({score: -1})

# 参照するドキュメントを一部表示しない。
> db.users.find({},{_id: 0}).skip(2)


### データの更新 ###
# デフォルトでは合致した最初の一行のみ更新がかかる。(※第三引数に{multi:true}を入れる事で全てのドキュメントに更新がかかる)
> db.users.update({name: "sato"},{$set: {score: 80}});
> db.users.update({name: "sato"},{name: "sato",score: 80});

# 元のデータを用いて乗算・除算
> db.users.update({name:"sato"},{$inc: {score: 5}});
> db.users.update({name:"sato"},{$mul: {score: 5}});

# フィールドの名前を変更
> db.users.update({name:"sato"},{$rename: {score: "point"}});

# フィールドの削除
> db.users.update({name:"sato"},{$set: {team: "D"}});
> db.users.update({name:"sato"},{$unset: {team: ""}});

# 抽出条件のドキュメントが存在する場合はupdate、存在しない場合はinsertの動きになる。
> db.users.update({name: "kato"},{name:"kato",score:48},{upsert: true})


### データの削除 ###
> db.users.remove({name: "kato"})


### その他 ###
# インデックスの作成
> db.users.createIndex({score: -1});
> db.users.dropIndex("score_-1");
> db.users.getIndexes();

# ユニークキーの作成
> db.users.createIndex({name: 1},{unique: true});

# データバックアップ
mongodump -d mydb
mongorestore --drop