SQLに慣れている人たちは、MongoDBのクエリは最初は戸惑うかもしれません。
この記事では、SQL経験者の方向けに、MongoDBのクエリの基本的な概念と使い方を解説します。
目次
MongoDBとSQLの大きな違い
- データモデル
SQL:リレーショナルデータベースであり、データはテーブルに格納され、厳密なスキーマを持つ必要があります。
MongoDB:ドキュメントデータベースであり、JSON形式のドキュメントを柔軟に格納できます。
スキーマは厳密ではなく、同じコレクション内に異なる構造のドキュメントを混在させることができます。 - クエリ言語
SQL:構造化クエリ言語であり、テーブルと列を指定してデータを検索します。
MongoDB:より柔軟な専用のクエリ言語を使用し、ドキュメント内のフィールドを直接指定して検索します。
MongoDBクエリの基本
MongoDBのクエリは、JavaScriptオブジェクトの形式で記述されます。
このオブジェクトをセレクターと呼びます。
db.collection.find(query)
db.collection
: データを検索するコレクションを指定します。query
: 検索条件を記述したオブジェクトです。
等号比較
db.users.find({ name: "太郎" })
上の例では、"name"フィールドが"太郎"であるすべてのドキュメントを検索します。
不等号比較( >(大なり) や <(小なり) )
db.products.find({ price: { $gt: 100 } })
上の例では、"price"フィールドが100より大きいすべてのドキュメントを検索します。$gt
は"greater than"の略です。
論理演算子
db.orders.find({
$and: [
{ status: "completed" },
{ amount: { $gt: 1000 } }
]
})
上の例では、"status"が"completed"かつ"amount"が1000より大きいすべてのドキュメントを検索します。$and
以外にも、$or
、$not
などの論理演算子があります。
正規表現(部分一致)
db.customers.find({ name: /John/i })
上の例では、"name"フィールドに"John"を含むすべてのドキュメントを検索します。i
オプションを付けることで、大文字小文字を区別せずに検索できます。
プロジェクション
db.users.find({}, { name: 1, age: 1 })
上の例では、"name"と"age"フィールドのみを結果に含めます。0
を指定すると、そのフィールドは除外されます。
その他の便利な機能
- 配列のクエリ:
$in
,$nin
を使って、配列内の要素を検索できます。 - 埋め込みドキュメント: ドキュメントの中にさらにドキュメントを埋め込むことができます。
- 参照: 別のコレクションのドキュメントを参照できます。
- インデックス: クエリのパフォーマンスを向上させるために、インデックスを作成できます。
まとめ
MongoDBのクエリは、NoSQLデータベース(リレーショナルデータベース(RDB)以外のデータベースの総称)の中でも非常に人気が高く、多くの開発者が利用しています。
大量のデータを取り扱うような場合や、非構造化データをツもつようなシステムに使われます。
より高度なクエリについては、公式ドキュメントを参照してください。
また別の記事でもアップする予定です。