SQL IS NULL / IS NOT NULLをMongoDBのNullクエリに変換する
SQL IS NULLとIS NOT NULLチェックが欠落またはnull値の処理のためにMongoDBのnull比較と$ne演算子に変換される方法を学びます。
Advanced
詳細な説明
MongoDBでのNULL処理
SQLのIS NULLとIS NOT NULLにはMongoDBの同等物がありますが、重要なニュアンスがあります:MongoDBはフィールドがnullであることと、フィールドが存在しないことを区別します。
SQLの例
SELECT * FROM users
WHERE deleted_at IS NULL
生成されるMongoDBクエリ
db.users.find({
deleted_at: null
})
IS NOT NULL
SELECT * FROM users
WHERE email IS NOT NULL
db.users.find({
email: { $ne: null }
})
MongoDBのNULLセマンティクス
フィルター{ field: null }は以下のドキュメントにマッチします:
- フィールドが存在し、値が
null - フィールドがドキュメントに存在しない
これはSQLとは異なります。SQLではカラムは常に存在し(スキーマの一部)、IS NULLはNULL値のみをチェックします。
フィールドの存在チェック
フィールドが存在するかどうか(値に関係なく)を具体的にチェックしたい場合は、$exists演算子を使用します:
// フィールドが存在する(nullを含む任意の値)
db.users.find({ avatar: { $exists: true } })
// フィールドが存在しない
db.users.find({ avatar: { $exists: false } })
NULLと存在チェックの組み合わせ
精密な制御のために:
// フィールドが存在しかつnull
db.users.find({ field: { $exists: true, $eq: null } })
// フィールドが存在しかつnullでない
db.users.find({ field: { $exists: true, $ne: null } })
実践では
ほとんどのSQLからMongoDBへの移行では、アプリケーションが通常すべての期待されるフィールドがドキュメントに存在することを保証するため、シンプルな{ field: null }と{ field: { $ne: null } }パターンで十分です。
ユースケース
deleted_at IS NULLでアクティブレコードをフィルタリングするソフトデリートパターンや、電話番号やアバターなどのオプションフィールドをチェックするユーザープロフィールクエリは日常的なパターンです。MongoDBがnullと欠落フィールドをどのように処理するかを理解することで、移行時の微妙なバグを防ぎます。