HOWTO · MongoDB
MongoDB の $ne 演算子
$ne 演算子は、不等号演算子とも呼ばれます。 find または update メソッドで使用できます。
このページの内容
MongoDB の $ne クエリ演算子は、フィールドの値が指定した値と等しくないドキュメントを選択します。値を除外するクエリに便利で、読み取り用と更新用のどちらのフィルターにも使えます。結果を解釈するうえで重要なのは、フィールドが存在しないドキュメントも $ne に一致する点です。フィールドの存在が必要な場合は、不等条件とあわせて $exists: true を指定してください。
$ne 演算子が一致するもの
式 { field: { $ne: value } } は、field が value と異なるかどうかを判定します。たとえば { city: { $ne: "New York" } } は、city が "New York" ではないドキュメントだけでなく、city フィールドが存在しないドキュメントも選択します。これは「フィールドが存在し、別の値を持つ」という意味ではありません。データが不完全なレコードを含む場合、この違いが件数や後続の更新に影響することがあります。
比較対象は指定した値です。配列を値に持つフィールドでは、MongoDB のクエリ照合規則により、2つのスカラー値を単純に比較する場合より結果が分かりにくくなることがあります。配列に対する動作を前提にする前に、データの形と演算子のドキュメントを確認してください。このガイドでは、一般的なスカラーフィールドを扱います。
クエリで $ne を使う
MongoDB シェルでは、条件を find に渡します。たとえば db.users.find({ city: { $ne: "New York" } }) は、city が "New York" と異なるか、フィールドが存在しないユーザーを検索します。文字列値は引用符で囲み、演算子名には $ が付きます。このクエリはフィルターであり、一致したドキュメントを変更しません。
city が存在しないドキュメントを対象に含めない場合は、条件を組み合わせます。db.users.find({ city: { $ne: "New York", $exists: true } }) は、指定した値を除外しながら、city フィールドが存在することを明示的に要求します。users、city、"New York" は、使用するデータのコレクション、フィールド、値に合わせてください。
これらは MongoDB シェルの式であり、単独で動作するプログラムではありません。データベースの結果を得るには、MongoDB サーバーとコレクションが必要です。この記事について実行を示す証拠は提供されていないため、結果セットや出力は示していません。
更新で $ne を使う
更新用フィルターでも、読み取り用フィルターと同じように $ne を使います。たとえば db.users.updateMany({ city: { $ne: "New York" } }, { $set: { status: "review" } }) は、city が "New York" と異なるか、フィールドが存在しないドキュメントの status を "review" に設定するよう MongoDB に指示します。フィルターが更新対象になり得るドキュメントを決め、$set が変更内容を指定します。
city フィールドがないドキュメントも一致するため、この更新にはそれらも含まれます。対象から除外するには、フィルターに city: { $ne: "New York", $exists: true } を追加してください。updateMany は一致するすべてのドキュメントに更新を適用しますが、変更された件数は一致した件数より少なくなることがあります。たとえば、すでに指定した status を持つドキュメントは変更不要な場合があります。一括更新を実行する前に、フィルターが意図したレコードを対象にしているか確認してください。上の式は構文の説明であり、このパケットではデータベースに対して実行されていません。
$ne と $not の違い
$ne は値との不等条件を表します。{ status: { $ne: "closed" } } は、status が "closed" と異なるドキュメントを検索し、status フィールドが存在しないドキュメントにも一致します。$not は、{ price: { $not: { $gt: 100 } } } のように演算子式を否定します。この例では、内側の $gt が比較を表し、$not がその式を否定します。
条件が「この値と等しくない」であれば $ne を選びます。サポートされている別の演算子式を否定する条件には $not を使います。フィールドが存在しない場合、どちらのクエリでも挙動が重要になることがあります。フィールドがない可能性がある場合や式が複雑な場合は、MongoDB の演算子ドキュメントを確認してください。$ne の使用例 と $not を参照してください。