カクカクしかじか

技術的なアレコレ

痒いところに手が届くmongoidの検索条件まとめ

はじめに

本記事は、mongoidでこういう検索条件で検索をしたいのだけど、どうやったらいいのか?という 痒いところに手が届くように、その他のmongoidの記事では触れていない部分に触れていきます。 サンプルが最初は少ないですが、順次更新していく予定です。 RubyでMongoDBを使おうとする人のお役に立てれば幸いです。

目次

  • その1:件数を指定して取得したい場合
  • その2:特定の条件を含めない結果が欲しい場合
  • その3:特定のモデルとアソシエーションを組んでいるモデルがデータとして存在するかを判定したい場合

軽く前提事項を確認

mongoidRailsにおける ActiveRecordのような感覚で、MongoDBを扱えるようにしたgemです。

実行環境

  • MongoDBのバージョン : 3.2.11
  • mongoidのバージョン : 4.0

事前にbrewの以下のコマンドでMongoDBを入れておくこと

  • 特に何も指定せずに brew install mongodb でインストールすると最新版になるため、今回の記事のバージョンを指定する場合は、 brew install mongodb@3.2 という形でインストールすること
  • 今回の場合は、特に指定しないでインストールしても問題ない( version 3.4.9 時点では動作検証済み)
$ brew install mongodb

検索条件アレコレ

その1:件数を指定して取得したい場合

  • 例えば、ヒットする条件のうち20件だけを取得してみる

limit(整数) を使う

# Rails consoleにて実施

# Userの作成日の降順で20件を取得
# ちなみに末尾の.to_aはmongoidのクエリを発行するためのメソッド
# .to_aと同様に.firstや.lastでもクエリが発行される
> user = User.order_by(:created_at => "desc").limit(20).to_a
=> [#<User _id: ユーザーID, created_at: 日付, updated_at: 日付
       <省略>
   ]
# 20件が取得出来ている事を確認
> user.count
=> 20
  • ActiveRecordのように User.last(20) のように最後の20件を取得みたいなことは出来ないので注意
# エラーになる
> User.last(20)
ArgumentError: wrong number of arguments (given 1, expected 0)

その2:特定の条件を含めない結果が欲しい場合

  • 例えば、hogeという名前じゃないユーザーを複数件取得したい

モデル名.nin(検索条件) を使う

# Rails consoleにて実施

# nin は not inの意味
> users = User.nin(name: "hoge").limit(20).to_a
=> [#<User _id: ユーザーID, created_at: 日付, updated_at: 日付
       <省略>
   ]

その3:特定のモデルとアソシエーションを組んでいるモデルがデータとして存在するかを判定したい場合

has_モデル名? を使う

  • 例1)userモデルがhas_manyでblogモデルを持っている場合(has_複数形?)
user.has_blogs?
=> true
  • 例2)hogeモデルがhas_oneでfugaモデルを持っている場合(has_単数形?)
hoge.has_fuga?
=> true

まとめ

mongoidに関する検索条件などに関する記事が少ないように感じたので、 投稿させて頂きました。 不備などありましたら、ご指摘頂ければ幸いです🙇‍♂️