▶ 技術めも
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