技術めも

MongoDB入門

http://dotinstall.com/lessons/basic_mongodb_v2/

スキーマレス

データベース
- BlogApp
コレクション(テーブル)
- Posts, Users
ドキュメント:レコード
- JSオブジェクト {name: "kouji", score: 30}

DBの操作

Database
- 一覧: show dbs;
- 新規作成 or 切り替え: use [DB名];
- 削除: db.dropDatabase();

mongo [DB名(無かったら作成)]
> help
> exit

mongo mydb
> show dbsl
local # システムが作成
> db.createCollection('test');
{ "ok" : 1 }
> show dbs;
local
mydb
> use local
switched to db local
> use mydb2
switched to db mydb2
> show dbs;
local
mydb
# Collectionが無いのでmydb2は表示されない

# DB削除
> use mydb
switched to db mydb
> db.dropDatabase();

Collectionの操作

- 一覧表示: show collections;
- 新規作成: db.createCollection('COL');
- 名前の変更: db.COL.renameCollection('newCOL');
- 削除: db.COL.drop();

ドキュメントの操作

- 新規作成: db.COL.insert();
- 全抽出: db.COL.find();
- 全削除: db.COL.remove();
- 個数: db.COL.count();

JavaScriptでデータをつくろう

for (var i = 0; i< 4; i++) {
	db.users.insert({
		name: "user-" + i,
		team: "team-" + (i % 3),
		score: Math.floor(Math.randam() * 100)
	});
}

→ コンソールにペースト

db.COL.find({key: value});
正規表現の利用
$gt, $gte
$lt, $lte
$ne

sb.users.find();
sb.users.find({});
sb.users.find({name: "user-1"});
sb.users.find({name: /user-[1-3]/});

sb.users.find({score: { $gt: 30 } }); # 30よりスコアが大きい

$gt $gte
$lt $lte
$ne

sb.users.find({name: { $ne: "user-a" } });

$and
$or
distinct

db.users.find({
	team: "team-0",
	score: { $lt: 50 }
}]);

db.users.find({
	$and: {
		{ team: "team-0" },
		{ score: { $lt: 50 } }
	]
}]);

db.users.find({
	$or: {
		{ team: "team-0" },
		{ score: { $lt: 50 } }
	]
}]);

db.users.find({
	$or: {
		{ team: { $in: ["team-0", "team-1"] } },
		{ score: { $exists: ture } }       // スコアが存在しているもの
	]
}]);

db.users.distinct("team");
 → チームの一覧(重複排除)

#09 findOne、skip、limit、sortを使おう

抽出するkeyの制限
findOne
skip, limit
sort

db.users.find({}, {name: 1}); // 名前だけ表示
db.users.find({}, {name: 0}); // 名前以外表示

db.users.find({}, {name: 1, score: 1}); // 名前、スコアだけ表示

db.users.find({}, {name: 1, score: 0}); // エラー 0 1 は同時使用不可
db.users.find({}, {name: 1, _id: 0});   // 例外で id 非表示は OK

db.users.findOne({}, {_id: 0});   // 1件表示
db.users.find({}, {_id: 0}).limit(3);   // 3件表示
db.users.find({}, {_id: 0}).skip(2).limit(3);   // 2件スキップ、3件表示

db.users.find({}, {_id: 0}).sort({ score: 1 });   // スコア小さい順
db.users.find({}, {_id: 0}).sort({ score: -1 });   // スコア大きい順

#10 索引(index)を使ってみよう

- 一覧: db.COL.getIndexes();
- 追加: db.COL.ensureIndex();
- 削除: db.COL.dropIndex();

db.users.getIndexes();
 "key": {"_id"} // デフォルト

db.users.ensureIndex({score: 1}); // スコアに昇順でINDEX(-1で降順)

db.COL.dropIndex({score: 1});
db.COL.dropIndex("score_1");  // INDEX名指定

ユニークキーの設定

db.users.ensureIndex({name: 1}, {unique: true});

db.COL.getIndexes();
db.COL.ensureIndex();
db.COL.dropIndex();
uniqueの設定

#11 updateを使ってみよう

db.users.update({name:"user-0"}, {score: 100}); // 間違い! user-0 のドキュメントが {"score" : 100} に置き換わる

db.users.update({name:"user-1"}, {$set: {score: 100}});

db.users.update({name:"user-1"}, {$unset: {score: ""}}); // そのキーを削除する(空文字を与える)

db.users.update({name:"user-2"}, {$inc: {score: 10}}); // インクリメント
db.users.update({name:"user-2"}, {$inc: {score: -10}}); // デクリメント

db.users.update({name:"user-2"}, {$rename: {score: "myscore"}}); // キー名の変更

db.COL.update();
$set
$unset
$inc
$rename

#12 multiを使ってみよう

updateの対象が複数

sb.users.update({team: "team-0"}, {$inc: {score: 10}}); // 間違い! 1件した対象にならない

sb.users.update({team: "team-0"}, {$inc: {score: 10}}, {multi: ture});

#13 upsert、removeを使ってみよう

データが存在していたら更新、存在していなかった挿入を行うupsertとremove

upsert (update / insert)

db.users.update({name: "taguchi"}, {name: "taguchi", team: "dotinstall", score: 200}, {upsert: true});

db.users.remove({name: "taguchi"}); // 条件付き削除

#14 mongodump、mongorestoreを使おう
データのバックアップ、復元を行うためのコマン

mongodump: バックアップ
mongorestore: 復元

show dbs;
mongodump -d mydb
 → デフォルトで dump というフォルダ作成

mongorestore --drop (--drop:既存DB上書きリストア)

mongodump --help
mongorestore --help