はじめに
本記事は、mongoidでこういう検索条件で検索をしたいのだけど、どうやったらいいのか?という痒いところに手が届くように、その他のmongoidの記事では触れていない部分に触れていきます。
サンプルが最初は少ないですが、順次更新していく予定です。
RubyでMongoDBを使おうとする人のお役に立てれば幸いです。
目次
- その1:件数を指定して取得したい場合
- その2:特定の条件を含めない結果が欲しい場合
- その3:特定のモデルとアソシエーションを組んでいるモデルがデータとして存在するかを判定したい場合
軽く前提事項を確認
mongoid
はRailsにおける 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でもクエリが発行される
> users = User.order_by(:created_at => "desc").limit(20).to_a
=> [#<User _id: ユーザーID, created_at: 日付, updated_at: 日付]
# 20件が取得出来ている事を確認
> users.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に関する検索条件などに関する記事が少ないように感じたので投稿させて頂きました。
これを機に使ったことがない方は試しにmongoidを使ってみてはいかがでしょうか。
また、不備などありましたら、ご指摘頂ければ幸いです。