mongoDB

f:id:aotree423:20180506144918p:plain

サーバーサイドをJavaScriptで記述できるNode.jsを覚えたかったので、その前準備としてNode.jsと相性の良いドキュメント指向型のNoSQL(Not only SQL)である、mongoDBを勉強したので基本的なコマンドをメモします。

RDBMSとの構造の違い

  • Database(=RDBMSで言うDatabase): collectionを複数入れられる箱
  • Document(=RDBMSで言うRecord): 個々のデータ
  • Collection(=RDBMSで言うTable): データの塊

コマンド (末尾のセミコロンはあってもなくてもよい)

- ログイン

  • mongo (ユーザー認証を有効化していない場合)

- ログアウト

  • exit

- ヘルプ

  • help;

- データベース一覧表示

  • show dbs;

- データベース切り替え

  • use db_name;

*存在しないデータベースを指定した場合、新規作成して切り替える

*mongoDBでは、データベースの中にコレクションやドキュメントを作るまでは存在しないことになっているため、use dbnameの後に、show dbをしても作成したdbnameは表示されない

- コレクション作成

  • db.createCollection("collection_name");

- 現在のDBに関する情報の表示

  • db.stats();

- データベースの削除

  • db.dropDatabase();

- Collection一覧表示

  • show collections;

- Collectionの名前の変更

  • db.collection_name.renameCollection("new_collection_name");

- Collectionの削除

  • db.collection_name.drop();

- Documentの作成

  • db.users.insert({field_name_1: value_1, field_name_2: value_2});

*指定したCollectionが存在しない場合、同時にCollectionも作成される

*MongoDBはスキーマレスなので、異なる構造のDocumentも作成できる

- カウント

  • db.collection_name.count();

- 全件抽出

  • db.collection_name.find();

*_id: ドキュメントを一意に決定するためにMongoDBが自動で付与する
- 全件削除

  • db.collection_name.remove({});

- 条件を指定しての抽出

  • db.collection_name.find({field: value});

- 以上/以下などの条件での抽出

  • db.collection_name.find({field: {$gte: 4}}); 

*$gte: greater than or equal to

 

- JavaScript正規表現

  • db.collection_name.find({team: /l/}); 

- あるフィールドにどんな値があるか

  • db.collection_name.distinct("field_name");

- and(,)

  • db.collection_name.find({name:/o/, score:{$gte:3}});

- or($or [,,,])

  • db.collection_name.find({$or: [{name:/o/}, {score:{$gte:5}}]});

- exists(あるフィールドが存在するドキュメントを抽出)

  • db.collection_name.find({field_name: {$exists: true}});

*trueは0でもよい
- 表示するフィールドの指定(_idはデフォルトで1)

  • db.collection_name.find({}, {name: 1, score: 1});

*0と1は混在不可(_idは例外)

 

指定フィールドの値を昇順で表示

  • db.collection_name.find({}, {_id: 0}).sort({score: 1}); 

- 指定フィールドの値を降順で表示

  • db.collection_name.find({}, {_id: 0}).sort({score: -1});

- 件数制限

  • db.collection_name.find({}, {_id: 0}).limit(2);

- sortとlimitの組み合わせ

  • db.collection_name.find({}, {_id: 0}).sort({score: -1}).limit(2);

- 1件表示

  • db.collection_name.findOne({}, {_id: 0}); 

- スキップ

  • db.collection_name.find({}, {_id: 0}).skip(2);

- update:第一引数は抽出条件

  • db.collection_name.update({name: "aoki"}, {$set: {score: 80, team: "red"}});

*特定のフィールドではなく、丸ごとupdateするときは$setを外して第二引数にオブジェクトを渡す
*最初の1件のみ更新される(第3引数に{multi: true}を渡すと全て更新される)

- inc

  • > db.collection_name.update({name: "aoyama"}, {$inc: {score: 5}});  

- mul

  • > db.collection_name.update({name: "aoyama"}, {$mul: {score: 4}});

- rename

  • > db.collection_name.update({name: "tanaka"}, {$rename: {score: "point"}}); 

- フィールドと値のセットをドキュメントに追加

  • > db.collection_name.update({name: "tanaka"}, {$set: {team: "green"}});

- フィールドと値のセットをドキュメントから削除

  • > db.collection_name.update({name: "tanaka"}, {$unset: {team: ""}});

*$unsetするフィールドの値は何でも良いが空文字がよく使用される

- index:フィールドにindexをつけると、該当フィールドで検索する際にパフォーマンスが向上する

  • db.users.getIndexes();

*_idに対しては_id_というインデックスが自動で付与されている

 

- index付与

  • db.collection_name.createIndex({field_name: 1});

*1: 昇順
*-1: 降順

- index削除

  • db.collection_name.dropIndex("score_-1");

*_idに対するインデックスは消せない

 

- ユニークキー付与

  • db.collection_name.createIndex({name: 1}, {unique: true});

- dbのバックアップ

  • mongodump -d db_name

- バックアップからの復元

  • mongorestore --drop

- mongodump, mongorestoreのヘルプ

  • mongodump --help
  • mongorestore --help

その他

- コマンド補完

  • tabキー

- JavaScriptの構文も使用できる

  • for (var i = 0; i < 10; i++) { db.users.insert({ score: Math.random() }); }
広告を非表示にする