MongoDB
code:bash
docker pull mongo:3.6
docker run --rm --name mongo_test -d mongo
docker exec -it mongo_test bash
# Mongoのシェルに接続
mongo
途中まで入力してTABで補完してくれる
use studystudyというDBに接続する
db.user.insert({id:1, name:'test_user', age: 10}); userコレクションを作成してinsert
db.user.find();userコレクションの確認
db.user.find({}, {name:1});userコレクションのname確認(0だと_idなし)
db.user.update({id:1}, {$set:{age:22}});update
db.user.remove({id:1});削除
db.user.remove({});全部削除
db.user.drop()コレクションを削除
とりあえずダミーデータをぶちこむ
code:create_dummy.js
var max = 100;
var min = 1;
for (var i=0; i<10000; i++) {
var age = Math.floor(Math.random() * (max - min) * min);
db.user.insert({id:i, age:age, name:i + '_test', money:age * 10000});
}
db.user.find()だけだと20件しかだしてくれない。つづいてitと打つと続きを出力する
制約を設ける
特に指定なしにinsertすると以下のような感じになる
> db.user.find()
{ "_id" : ObjectId("5c26b3364acf543ecadfc0f7"), "id" : 1, "name" : "test" }
{ "_id" : ObjectId("5c26b3374acf543ecadfc0f8"), "id" : 1, "name" : "test" }
{ "_id" : ObjectId("5c26b3374acf543ecadfc0f9"), "id" : 1, "name" : "test" }
{ "_id" : ObjectId("5c26b3374acf543ecadfc0fa"), "id" : 1, "name" : "test" }
ここで、idを主キー、nameをnot nullにしたい
code:js
db.user.createIndex({id: 1, name: 1}, {unique: true})
> db.user.insert({id:1})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
挿入
> db.user.insert({id:1})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
失敗するようになった
重複
> db.user.insert({id: 1, name: 'taro', age: 22})
WriteResult({ "nInserted" : 1 })
> db.user.insert({id: 1, name: 'taro', age: 22})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: study.user index: id_1_name_1 dup key: { : 1.0, : \"taro\" }"
}
})
重複も失敗するようになった
集計する
参考
aggregate関数を使う
code:agg.js
db.user.aggregate([
{$match: {"id": {$lt:10}}},
{$group: {_id: 1, total: {$sum: "$money"}, average: {$avg: "$money"}}}
])