MongoDBはみなさん、使っていますか?
noSQLの中では、定番のテータベースですね。
私は、数年前から、 MEAN Stack (MongoDB、Express.js、Angular.js、Node.js)でMongoDBを使い始めました。
その後、MongoDBの会社も上場しましたよね。
https://finance.yahoo.com/quote/MDB/
リレーショナルDBと違って、MongoDBがjsonの形データを保管します。もちろん、CRUDの操作もできます。
SQLは使いませんが、複雑な検索もできます。
JavaScriptのエコシステムでは、jsonデータそのまま、DBからバックエンド、フロントエンド共通で操作、使用できるので
非常に理解しやすいスキーマになります。
私も、好んでJavaScriptのエコシステムを選んで使っています。
(もちろん、昔は、LAMPとRDBの人間でもありますが)
今回の記事は、MongoDBを使うときに、よく登場する操作をご紹介します。
ときとき、ここでコピペして使うこともあります。笑
mongoDBのシェルで操作するものです!https://docs.mongodb.com/manual/mongo/
目次
基本概念
簡単にMongoDBとRDBの用語を比較します。
| MongoDB | RDB |
|---|---|
| データベース | データベース |
| コレクション | テーブル |
| ドキュメント | 行(レコード) |
| フィールド | 列 |
Collection:コレクションは「テーブル」のようなものです。
Document:ドキュメントは「レコード一行」のようなものです。
Field:フィールドは「列」のようなものです。
この3つの概念(言葉)がよく登場しますので、イメージを持っておくと便利です。
演算子
| 一般的な演算子 | MongoDBで | 説明 | 例 |
|---|---|---|---|
| < | $lt | little than 右辺より小さい | {number:{$lt:100} } |
| <= | $lte | little then or equal 右辺以下 | {number:{$lte:100} } |
| > | $gt | greater than 右辺より大きい | {number:{$gt:100} } |
| >= | $gte | greater than or equal 右辺以上 | { number:{$gte:100} } |
| != | $ne | not equal 等しくない | { name:{$ne:’suzuki’} } suzukiではない人 |
| 存在 | $exists | フィールド(列)自体の存在チェック | db.example.find({ hoge:{$exists:false} }) |
| OR | $or | $orで指定する条件のいずれかを満たすものを抽出 | db.example.find({$or:[{like:’apple’},{like:’orange’}]}) |
全件抽出
注意:下記のコマンドは可能な限り、正確さを確認しておりますが、完全に動作することを保証するものではありません。
下記コマンドをご自身の責任で、確認した上、実行してください。
例:ユーザーの全件を抽出する
db.users.find({})
例:男性のユーザーを抽出する
db.users.find({"gender":"male"})
dbはデータベース、usersはユーザー「テーブル」
findは英語の通り、「探す」。後ろは条件で、gender==maleといったような「気持ち」で。
フィールド「列」を削除する
mongoDBを使うときに、最初からガチガチcollection「テーブル」のfield「列」を決めずに、試行錯誤で構築していく場合もあります。
そのとき要らないフィールド「列」を削除したい時があります。
db.example.update({},{$unset: {field_to_go:1}}, {multi: true})
field_to_goというフィールド「列」をコレクションにある全てのドキュメントから削除されます。(その列がなくなる)
フィールド名を変える
db.mycollection.update({},{$rename:{"name.additional":"name.last"}},false,true)
name.additional –> name.last に変更する
あるいは
db.mycollection.updateMany( {}, { $rename: {"name.additional":"name.last" } } )
フィールド名が「空」の行を削除する
//remove empty field name
db.mycollection.find({}).forEach(function(document) {
delete document[''];
db.mycollection.save(document);
})
フィールド「列」を追加
//add field
db.words.update(
{},
{$set:
{
"language_type" : "英語"
}
},false,true
)
wordsというコレクション「テーブル」に全てのドキュメント「行」にlanguage:’英語’を追加します。
配列の列を追加する
////フィールド追加
db.activities.update(
{},
{$set:
{
“likes" : []
}
},false,true
)
activitiesというコレクション「テーブル」に全てのドキュメント「行」にlikes:[]を追加します。likesはフィールド名、その中に入るのは配列です。
ドキュメント「行」を削除する
//// remove document
db.example.update({target:''},{$unset:{field_to_go:1}},{multi: true});
targetというフィールドが空であれば、その集合から、field_to_goの列を全部削除する
まとめ
最初は慣れる前に、戸惑うことが多いですが
慣れれば、割としっくりくるものなので、
また、随時更新、追加していきます。
では、また!
