カクカクしかじか

技術的なアレコレ

mongoidのModel.where(field: { '$exists' => true }はフィールドが存在したら無条件で値を取ってきてしまうのでnilチェックされないという落とし穴

前提

  • BlogモデルとUserモデルがある
  • BlogはUserにbelogs_toの関係
  • Blogのデータに対してUserが存在するデータだけを検索したい場合

落とし穴

mongoidの Blog.where(user: { '$exists' => true } は フィールドが存在したら無条件で値を取ってきてしまうので、 nilチェックはそのあとの処理で行う必要があるということを知りませんでしたw

対応方法(2つ)

  • 後続処理でnilチェックを行う
  • Blog.where(user: { '$exists' => true, '$ne' => nil }) で検索する

field.exists => trueだと大丈夫っぽい...

{ '$exists' => true }はmongoidというより、
MongoDBのクエリとして吐かれるっぽく?たぶんnilをチェックしてくれないっぽい予感...
なので、このケースだとたぶん正常に値は取れそう...

Member.where(:status.exists => true)

たぶんActiveRecordを経由しないで
SQLを直打ちすると今回のようなことが起こりそうだなと
ActiveRecordを普段業務で使ってないRailsエンジニアとして想像してしまいました。