mongosh の基本的な操作をまとめました

皆さん、こんにちは。LP開発グループのn-ozawanです。
今日は建国記念日です。日本がいつ建国したのか不明なため、日本の建国は初代天皇である神武天皇が即位された日としていますが、その日も日本書紀の記載から推定したものであり、学術的に確定した日ではありません。その性質から、建国記念日は国民の祝日の中で唯一政令で定められています。

本題です。
mongoshはMongoDBを操作するためのツールで、いたるところでお世話になることでしょう。今回はそんなmongoshの基本的な操作をまとめてみました。

基本的なmongosh の操作

データベースの一覧を表示する

データベースの一覧を表示します。

show dbs

データベースを指定する

データベースを指定します。データベースを指定せずに接続した場合はtestが使われます。指定したデータベースが存在しない場合は自動で作られます。

use hoge

データベースを削除する

データベースを削除するには、削除したいデータベースを指定してから削除コマンドを実行します。

use hoge
db.dropDatabase()

コレクションの一覧を表示する

コレクションの一覧を表示します。

show collections

コレクションを削除する

特定のコレクションを削除します。

db.hoge.drop()

コレクションに関して操作したい場合は、db.{コレクション名}.{操作}という構文をとります。なので、コレクションを削除した場合は、db.{削除したいコレクション名}.drop()となります。この構文はこの後のドキュメント操作でも同じです。

ドキュメントを検索する

無条件でドキュメントを検索します。

db.collection.find()

検索条件を指定したい場合は、第1引数に条件を指定します。

db.collection.find({orderId: 204})                // orderIdが204のドキュメントを検索
db.collection.find({orderId: 204, prodId: 103})   // orderIdが204、かつ、prodIdが103のドキュメントを検索
db.collection.find({orderId: {$gte: 200}})        // orderIdが200以上のドキュメントを検索
db.collection.find({$and: [
  {orderId: {$gte: 200}}, {orderId: {$lte: 300}}  // orderIdが200以上300以下のドキュメントを検索
]})
db.collection.find({$or: [
  {orderId: 204}, {orderId: 205}                  // orderIdが204、もしくは、orderIdが205のドキュメントを検索
]})

検索するドキュメントのフィールドを絞りたい場合は、第2引数に条件を指定します。

db.collection.find({}, {_id: 0, orderId: 1})  // orderIdのみを表示する

Mongo DB では_idは一意キーで特殊なフィールドとなっており、ドキュメントに必ず存在します。特に指定が無い場合は必ず表示されますので、_id: 0を指定することで非表示にします。なお、第1引数の{}は無条件で全てのドキュメントを検索します。

ドキュメントを挿入する

ドキュメントを挿入するコマンドは2つあります。

db.collection.insertOne(
  {orderId: 317, prodId: 102}   // 1件挿入
)
db.collection.insertMany([
  {orderId: 317, prodId: 102},  // 複数件挿入
  {orderId: 317, prodId: 102}
])

db.collection.insertOne()は1件挿入で、db.collection.insertMany()は複数件挿入です。引数がオブジェクトと配列で異なるので注意が必要です。また、先ほど述べた通り、_idは特殊なフィールドですので、上記のように指定しなければ勝手に付与されます。

ドキュメントを更新する

ドキュメントを更新するコマンドも2つあります。

db.collection.updateOne({orderId: 209}, {$set: {prodId:105}})   // 1件更新
db.collection.updateMany({orderId: 209}, {$set: {prodId:105}})  // 複数件更新

db.collection.updateOne()は1件更新で、db.collection.updateMany()は複数件更新です。引数はどちらも同じで、第1引数には更新対象の条件を指定し、第2引数には更新内容を指定します。もし、1件更新であるdb.collection.updateOne()の対象条件で複数件のドキュメントがマッチした場合、どれか1つだけが更新されます。

第2引数には更新演算式($setのところ)を指定します。$setはフィールドの更新を意味します。もしフィールドが無ければ追加します。他にも、フィールドを削除する$unsetや、フィールド名を変更する$renameなどがあります。

db.collection.updateOne({orderId: 209}, {$set: {prodId:105}})          // prodIdを105に変更
db.collection.updateOne({orderId: 209}, {$unset: {prodId:1}})          // prodIdを削除
db.collection.updateOne({orderId: 209}, {$rename: {prodId:"hogeId"}})  // prodIdをhogeIdに名前変更

ドキュメントを削除する

ドキュメントを削除するコマンドも2つあります。

db.collection.deleteOne({orderId: 209})    // 1件削除
db.collection.deleteMany({orderId: 209})   // 複数件削除

db.collection.deleteOne()は1件削除で、db.collection.deleteMany()は複数件削除です。第1引数には削除対象の条件を指定します。db.collection.deleteOne()で複数件マッチした場合は、どれか1つだけが削除されます。

発展した使い方

ここまで見てみると、コマンドと言うよりかはプログラムの印象を受けます。実はmongoshはJavaScriptおよびNode.jsのREPL環境で動いているため、以下のような記述も出来ます。

["hoge","foo","bar"].forEach(name => db.getCollection(name).insertOne({x: 1}))

上記は配列をforEachで回すことで、hogefoobarの3つコレクションに同じドキュメントを挿入するコマンドです。JavaScriptを知っている人であれば馴染みのある書き方かと思います。

データベース配下のコレクションを全て削除したい場合は、以下のような記述ができます。

db.getCollectionNames().forEach(name => db.getCollection(name).drop())

おわりに

MongoDBで扱うドキュメントはBSONで、BSONは「バイナリ型JSON」です。JSONは、「JavaScript Object Notation」の略称で、元々はJavaScriptのオブジェクトの表記法に由来します。そういった背景からmongoshもJavaScriptの感覚で書けるのでしょう。JavaScriptを知っているエンジニアであれば、親和性が高く扱えるかと思います。

ではまた。

Recommendおすすめブログ