MongoDB
#NoSQL #database
とりあえずdockerで試す
code:bash
docker pull mongo:3.6
docker run --rm --name mongo_test -d mongo
docker exec -it mongo_test bash
# Mongoのシェルに接続
mongo
MongoDBを操作する
MongoDB超入門
途中まで入力して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()コレクションを削除
とりあえずダミーデータをぶちこむ
Javascriptが使えるらしい https://qiita.com/twipg/items/a08816b9dfecdfc3de3a
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.createCollection("user", {validator: {$jsonSchema: {required: "id", "name", "age"}}})
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\" }"
}
})
重複も失敗するようになった
集計する
NoSQLでもこれができないとね
参考
MongoDBのAggregationを使ってみる
MongoDB における 集計 (Aggregatioin) の 基本
aggregate関数を使う
code:agg.js
db.user.aggregate([
{$match: {"id": {$lt:10}}},
{$group: {_id: 1, total: {$sum: "$money"}, average: {$avg: "$money"}}}
])