SQL IS NULL / IS NOT NULLをMongoDBのNullクエリに変換する

SQL IS NULLとIS NOT NULLチェックが欠落またはnull値の処理のためにMongoDBのnull比較と$ne演算子に変換される方法を学びます。

Advanced

詳細な説明

MongoDBでのNULL処理

SQLのIS NULLIS 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 }は以下のドキュメントにマッチします:

  1. フィールドが存在し、値がnull
  2. フィールドがドキュメントに存在しない

これは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と欠落フィールドをどのように処理するかを理解することで、移行時の微妙なバグを防ぎます。

試してみる — SQL to MongoDB Query

フルツールを開く