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の列を全部削除する
まとめ
最初は慣れる前に、戸惑うことが多いですが
慣れれば、割としっくりくるものなので、
また、随時更新、追加していきます。
では、また!