ポイント: 23の一般的なMongoDBクエリ演算子は、比較、論理、配列演算子など、さまざまなタイプを通じて高度なデータクエリを可能にし、その使用法を示す実際の例を提供します。
- $eq、$gt、および$ltのような演算子は、文書の値を比較します。
- $andや$orのような論理演算子は、複数のクエリ条件を組み合わせます。
この記事では、最も一般的に使用されるMongoDBクエリ演算子について見ていきます。それらが何をするのかを説明し、どのように機能するかを示す例を共有します。
プロジェクション演算子がクエリパフォーマンスを最適化する方法についてもっと学びましょう:
MongoDBクエリ演算子について
MongoDBの演算子とは何ですか?
MongoDB演算子は、データベースと対話するために使用できる特別な記号またはキーワードです。それらはコンパイラまたはインタープリタに数値的または論理的な操作を実行するよう指示します。
クエリ演算子は、開発者がアプリケーションに適合したデータセットと対話するために複雑なクエリを作成できるようにすることで、MongoDBの機能を強化します。
AIOpsの始め方は簡単です。企業運営のための人工知能を使用して、ITの複雑さを管理します。
MongoDBのクエリ演算子の異なるタイプは何ですか?
MongoDBは、次のクエリ演算子の種類を提供します:
MongoDBでクエリ演算子をどのように使用できますか?
MongoDBの演算子は、サポートされている任意のMongoDBコマンドで使用できます。正しく使用すれば、Mongo Shell基本コマンドは、含まれているフィールドと除外されるフィールドを制御することによってクエリ負荷を軽減できます。結果はパフォーマンスの向上です。
MongoDBクエリ演算子の例
さて、一般的に使用されるMongoDBクエリ演算子を見てみましょう。すべてに触れるわけではありませんが、非常に多くあります。次のデータセットを使用して、各演算子の機能を示すためにfind()関数を使用します。
データベース: スーパーマーケット
コレクション: 従業員、インベントリ、支払い、プロモ
use supermarket
db.employees.find()
db.inventory.find()
db.payments.find()
db.promo.find()
データセット:
MongoDBの比較演算子
MongoDBの比較演算子は、文書内の値を比較するために使用できます。次の表には、一般的な比較演算子が含まれています。
| 演算子 | 説明 |
| $eq | 指定された値に等しい値と一致します。 |
| $gt | 指定された値より大きい場合に一致します。 |
| $lt | 指定された値より小さい場合に一致します。 |
| $gte | 指定された値以上の場合に一致します。 |
| $lte | 指定された値以下の場合に一致します。 |
| $in | 配列内のいずれかの値に一致します。 |
| $ne | 指定された値と等しくない値に一致します。 |
| $nin | 配列内の指定された値のいずれにも一致しません。 |
$eq演算子は、フィールドの値が特定のものである文書に一致するようにクエリに明確さを加えます。
この$eq演算子の例では、正確な_id値「LS0009100」を持つ文書を取得します。
db.inventory.find({"_id": { $eq: "LS0009100"}}).pretty()
結果:
$gtと$ltオペレーター
これらの2つの関連オペレーターは、「より大きい」と「より小さい」指定された値を返します。
この$gtオペレーターの例では、`quantity`が5000より大きい文書を取得します。
db.inventory.find({"quantity": { $gt: 5000}}).pretty()
結果:
$ltオペレーターを使用して、5000未満の「quantity」を持つ文書を見つけます。
db.inventory.find({"quantity": { $lt: 5000}}).pretty()
結果:
$gteおよび$lte演算子
これらの演算子は、“equal to”のパラメータを追加することによって上記の2つを洗練させ、2つの値の間に含まれる結果を得ることができます。
次の$gte演算子の例を使用して、‘quantity’が12,000以上のドキュメントを見つけます。
db.inventory.find({"quantity": { $gte: 12000}}).pretty()
結果:
次のクエリは、数量が1000以下のドキュメントを返します。
db.inventory.find({"quantity": { $lte: 1000}}).pretty()
結果:
$inおよび$nin演算子
$inおよび$nin演算子は、値が指定された値のセットに含まれるか、または含まれない結果を返します - それは指定された配列に一致するか、一致しないかです。
次のクエリは、価格フィールドが指定された値を含むドキュメントを返します。
db.inventory.find({"price": { $in: [3, 6]}}).pretty()
結果:
価格フィールドが指定された値を含まないドキュメントを見つけたい場合は、次のクエリを使用します。
db.inventory.find({"price": { $nin: [5.23, 3, 6, 3.59, 4.95]}}).pretty()
結果:
$ne演算子は、指定された値と等しくない値に一致する結果を返します。これは、クエリに関連しないものを除外するのに役立ちます。
インベントリコレクション内で、価格フィールドの値が5.23と等しくないドキュメントを見つけます。
db.inventory.find({"price": { $ne: 5.23}})
結果:
MongoDBの論理演算子
MongoDBの論理演算子は、与えられた条件に基づいてデータをフィルタリングするために使用できます。これらの演算子は、複数の条件を組み合わせる方法を提供します。各演算子は、与えられた条件を真または偽の値に等しくします。
MongoDBの論理演算子の例は以下の通りです:
| 演算子 | 説明 |
| $and | 2つ以上のクエリを論理ANDで結合し、すべての条件に一致するドキュメントを返します。 |
| $or | 2つ以上のクエリを論理ORで結合し、いずれかのクエリに一致するドキュメントを返します。 |
| $nor | OR演算子の反対です。論理NOR演算子は2つ以上のクエリを結合し、指定されたクエリ条件に一致しないドキュメントを返します。 |
| $not | 指定されたクエリ式に一致しないドキュメントを返します。 |
2つ以上のクエリに応じた結果を得るには、それらを$and演算子で結合します。
以下の条件の両方に一致するドキュメントを見つけます
- job_roleが「Store Associate」と等しい
- emp_ageが20から30の間
db.employees.find({ $and: [{"job_role": "Store Associate"}, {"emp_age": {$gte: 20, $lte: 30}}]}).pretty()
結果:
$orおよび$nor演算子
1つのクエリ、または複数のクエリに一致する結果を得るには、$or論理演算子を使用します。クエリのいずれにも一致しない結果を得るには、$nor演算子を使用します。
以下の条件のいずれかに一致するドキュメントを見つけます。
- job_roleが「Senior Cashier」または「Store Manager」と等しい
- job_roleが「Senior Cashier」または「Store Manager」と等しい
db.employees.find({ $or: [{"job_role": "Senior Cashier"}, {"job_role": "Store Manager"}]}).pretty()
結果:
以下の条件のいずれにも一致しないドキュメントを見つけます。
- job_roleが「Senior Cashier」または「Store Manager」と等しい
db.employees.find({ $nor: [{"job_role": "Senior Cashier"}, {"job_role": "Store Manager"}]}).pretty()
結果:
特定の結果を除外したい場合は、$not演算子を使用して除外パラメータを指定できます。
与えられた条件に一致しないドキュメントを見つけます。
- emp_ageが40以上ではない
db.employees.find({ "emp_age": { $not: { $gte: 40}}})
結果:
MongoDBの要素演算子
要素MongoDBクエリ演算子は、ドキュメントのフィールドを使用してドキュメントを特定するために使用されます。以下の表には、現在の要素演算子がリストされています。
| 演算子 | 説明 |
| $exists | 指定されたフィールドを持つドキュメントに一致します。 |
| $type | 指定されたフィールドタイプに従ってドキュメントに一致します。これらのフィールドタイプは、BSONタイプとして指定され、タイプ番号またはエイリアスで定義できます。 |
$exists演算子を使用して、特定のフィールドを持つドキュメントをフィルタリングします。
job_roleフィールドが存在し、「Cashier」と等しいドキュメントを見つけます。
db.employees.find({ "emp_age": { $exists: true, $gte: 30}}).pretty()
結果:
住所フィールドを持つドキュメントを見つけます。(現在のデータセットには住所フィールドが含まれていないため、出力はnullになります。)
db.employees.find({ "address": { $exists: true}}).pretty()
結果:
データベースオブジェクトがBSON表記で型に注記されている場合、$type演算子を使用して、特定の望ましいオブジェクト型に応じて結果をフィルタリングします。
次のクエリは、emp_ageフィールドがダブル型である場合にドキュメントを返します。異なるデータ型を指定した場合、フィールドが存在していても、正しいフィールド型に対応しないため、ドキュメントは返されません。
db.employees.find({ "emp_age": { $type: "double"}})
結果:
db.employees.find({ "emp_age": { $type: "bool"}})
結果:
MongoDBの評価演算子
MongoDBの評価演算子は、ドキュメント内の全体のデータ構造または個々のフィールドを評価できます。これらの演算子の基本機能のみを見ていますが、これらの演算子のそれぞれは高度なMongoDB機能と見なすことができます。MongoDBの一般的な評価演算子の一覧を以下に示します。
| 演算子 | 説明 |
| $jsonSchema | 指定されたJSONスキーマに従ってドキュメントを検証します。 |
| $mod | 指定された値で割った余りと等しい場合のドキュメントに一致します。 |
| $regex | 指定された正規表現に一致するドキュメントを選択します。 |
| $text | 指定されたフィールドでテキスト検索を実行します。検索は、フィールドがテキストインデックスでインデックスされている場合にのみ実行できます。 |
| $where | JavaScript式を満たすドキュメントに一致します。 |
$jsonSchema オペレーター
パラメーターを指定するために$jsonSchemaオペレーターを使用して、JSONスキーマによって文書を検証します。
promoコレクション内で、次のJSONスキーマに一致する文書を見つけます。
$let集約を使用して、結果オブジェクトに変数をバインドし、よりシンプルな出力を実現します。JSONスキーマでは、「period」フィールドの最小値を7に指定しており、これにより小さい値の文書はフィルタリングされます。
let promoschema = {
bsonType: "object",
required: [ "name", "period", "daily_sales" ],
properties: {
"name": {
bsonType: "string",
description: "promotion name"
},
"period": {
bsonType: "double",
description: "promotion period",
minimum: 7,
maximum: 30
},
"daily_sales": {
bsonType: "array"
}
}
}
db.promo.find({ $jsonSchema: promoschema }).pretty()
結果:
$mod演算子を使用して、特定の数値と余りを使ってフィールドの値を割り算し、結果を選択します。
在庫コレクション内で、3000で割ったときの余りが1000の文書を見つけます。
「Milk Non-Fat – 1lt」という文書は、数量が1000であり、3000で割り切れず、余りが1000であるため、出力に含まれます。
db.inventory.find({"quantity": {$mod: [3000, 1000]}}).pretty()
結果:
$regex演算子を使用して、文字列内でパターンマッチングを行う正規表現を使用します。
在庫コレクション内の名前フィールドに「Packed」という単語を含む文書を見つけます。
db.inventory.find({"name": {$regex: '.Packed.'}}).pretty()
結果:
単語やフレーズを含む結果を見つけるには、$text演算子を使用してテキスト検索を行います。
名前フィールド内で「Non-Fat」を検索するテキストを使用して文書を見つけます。フィールドがインデックスされていない場合は、検索する前にテキストインデックスを作成する必要があります。
db.inventory.createIndex({ "name": "text"})
結果:
db.inventory.find({ $text: { $search: "Non-Fat"}}).pretty()
結果:
JavaScript式に一致する結果を見つけるには、$where演算子を使用します。
フィールドが文字列型で、与えられたmd5ハッシュと等しい「payments」コレクションの文書を見つけます。
db.payments.find({ $where: function() { var value = isString(this._id) && hex_md5(this._id) == '57fee1331906c3a8f0fa583d37ebbea9'; return value; }}).pretty()
結果:
MongoDBの配列演算子
MongoDBの配列演算子は、配列を持つ文書をクエリするために設計されています。以下は、MongoDBが提供する配列演算子です。
| 演算子 | 説明 |
| $all | クエリ条件に指定されたすべての値を含む配列に一致します。 |
| $size | 配列のサイズがクエリで指定されたサイズと等しい場合にドキュメントに一致します。 |
| $elemMatch | 各配列要素内の指定された$elemMatch条件に一致するドキュメントに一致します。 |
クエリ条件で指定されたすべての値を含む配列には、$all演算子を使用します。
カテゴリー配列フィールドに「healthy」と「organic」の値が含まれる文書を見つけます。
db.inventory.find({ "category": { $all: ["healthy", "organic"]}}).pretty()
結果:
$size演算子を使用して、特定のサイズに一致する結果のみを返すようにフィルタリングします。
カテゴリー配列フィールドに2つの要素がある文書を見つけます。
db.inventory.find({ "category": { $size: 2}}).pretty()
結果:
$elemMatch演算子を使用して、配列内のすべての指定されたクエリ条件を満たす少なくとも1つの要素がある結果に一致します。
「daily_sales」配列内の少なくとも1つの要素が200未満で100より大きい文書を見つけます。
db.promo.find({ "daily_sales": { $elemMatch: {$gt: 100, $lt: 200}}}).pretty()
結果:
MongoDBのコメント演算子
MongoDBのコメントクエリ演算子は、クエリ述語を取る任意の式にコメントを関連付けます。クエリにコメントを追加することで、データベース管理者はMongoDBログを簡単に追跡し、解釈できます。
$commentオペレーター
promoコレクション内で期間が7に等しい文書を見つける際に、find操作にコメントを追加します。
db.promo.find({ "period": { $eq: 7}, $comment: "Find Weeklong Promos"}).pretty()
結果:
コメントを追加すると、ユーザーはMongoDBログ内のコマンドを簡単に識別できます。上記の操作は、以下のようにログされます。
db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})
結果:
MongoDBの演算子をさらに発見
この記事では、MongoDBの演算子の表面を少し触れただけです。プロジェクション演算子や集約関数を使用して、データベースの全体的な機能をさらに拡張できます。
関連する読み物
- BMC機械学習とビッグデータブログ
- MongoDBシャーディング:概念、例、チュートリアル、MongoDBガイドの一部
- BMCガイド、Apache CassandraやSpark、AWS、機械学習、データビジュアライゼーションなどのさまざまなトピックに関する一連の記事を提供します。
- データストレージの説明:データレイク対データウェアハウス対データベース
MongoDBガイド
- MongoDBの概要:MongoDBの始め方
- UbuntuおよびMacにMongoDBをインストールする方法
- MongoDBでのデータベースの作成
- MongoDBシェルの基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBのロールベースのアクセス制御(RBAC)について
- MongoDBのプロジェクションとプロジェクション演算子について
- MongoDBの集約関数について
- MongoDBのソート:sort()メソッドと例
- MongoDBにおけるPushとPull演算子の使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリ演算子とその使い方
- MongoDBのGeoLocationクエリの例
- MongoDBトランザクションの紹介
- MongoDBのインデックス:主要なインデックスタイプとその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスターの設定方法
- MongoDBシャーディング:概念、例、チュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用量、管理、および要件
- MongoDBバックアップ用のmongodumpの使用方法
- MongoDBバックアップを復元するためのMongorestoreの例
- PyMongoの使用方法
- MongoDBおよびNodeJS用のMongooseの使用方法
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認定:紹介
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。