Docs Menu
Docs Home
/ / /
Mongoid
/

クエリを指定する

項目一覧

  • Overview
  • サンプル データ
  • Mongoid のクエリ
  • クエリフィルターを作成する
  • フィールド構文
  • クエリAPIシンタックス
  • シンボル演算子構文
  • 異なるフィールド型に対するクエリ
  • 定義済みフィールド
  • Raw Values
  • フィールド エイリアス
  • 埋め込みドキュメント
  • 論理演算
  • 演算子の組み合わせ
  • ではない動作
  • 増分クエリ構築
  • 合併戦略
  • サポートされている演算子メソッド
  • 演算子値の拡張
  • 要素一致
  • 関連付け
  • _id 値によるクエリ
  • find バリエーション
  • 正規表現
  • フィールド型クエリの変換
  • 追加のクエリメソッド
  • ドキュメントをカウント
  • 一般的なメソッド
  • フィールド値を調査
  • その他
  • 詳細情報

このガイドでは、Mongoid を使用してクエリを指定する方法を学習できます。

クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。クエリフィルターは、 MongoDB が読み取りまたは書込み (write)操作においてドキュメントを照合するために使用する検索条件を指定する式です。 クエリフィルター を作成するときに、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressためにクエリフィルターを作成することもできます。

Mongoid は、Active レコードで使用されるのと同様のクエリ ドメイン固有言語(DSL)を提供します。

このガイドの例では、バンドまたはステージを表す Band モデルを使用します。 Band モデルの定義は、異なるクエリ機能を示すために、各セクションで異なる場合があります。 一部のセクションでは、クエリ機能を示すために他のモデルを使用する場合があります。

Mongoid クエリ メソッドは、 MongoDB Query APIの連鎖可能で遅延評価されるラッパーである Mongoid::Criteria オブジェクトを返します。 クエリは、結果を反復処理するときに実行されます。 次の例では、単純なクエリの戻り値の型を示しています。

# Creates a simple query
Band.where(name: "Deftones")
# Returns a Criteria object
# => #<Mongoid::Criteria
# selector: {"name"=>"Deftones"}
# options: {}
# class: Band
# embedded: false>
# Evaluate the query by converting to JSON
Band.where(name: "Deftones").to_json
# Returns matching documents
# => [{"_id":"...","name":"Deftones"}]

個々のドキュメントを返すには、firstlast などのメソッドを使用します。 また、eachmap などのメソッドを使用して Criteriaオブジェクトを反復処理し、サーバーからドキュメントを取得することもできます。 to_json を使用して CriteriaオブジェクトをJSONに変換できます。

Tip

チェーン メソッド

既存の Criteriaオブジェクトで他のクエリ メソッドを連鎖させると、Mongoid はフィルター条件をマージします。

このセクションでは、フィルター条件を作成するために使用できる構文パターンについて説明します。 Mongoid では、次の構文パターンのいずれかを使用してクエリを指定できます。

  • フィールド構文

  • クエリAPI構文

  • シンボル演算子構文

注意

シンタックス動作

これらの構文規則は、ドット表記を使用した埋め込みドキュメントのクエリをサポートしています。 構文は、クエリ対象のフィールドが モデルクラスで定義されている場合、 フィールドエイリアスとフィールド型も尊重します。

このセクションの例では、次のモデル定義を使用します。

class Band
include Mongoid::Document
field :name, type: String
field :founded, type: Integer
field :m, as: :member_count, type: Integer
embeds_one :manager
end
class Manager
include Mongoid::Document
embedded_in :band
field :name, type: String
end

フィールドクエリ構文では、基本的なRubyハッシュが使用されます。 キーはシンボルまたは string にすることができ、 MongoDBドキュメント内のフィールド名に対応します。

次のコードは、フィールドクエリ構文を使用して、nameフィールド値が 'Depeche Mode' であるドキュメントを検索する 2 つの同等のクエリを示しています。

Band.where(name: 'Depeche Mode')
Band.where('name' => 'Depeche Mode')

次の同等のクエリに示すように、 ハッシュ構文 を使用して任意のフィールドに Query API演算子を指定できます。

Band.where(founded: {'$gt' => 1980})
Band.where('founded' => {'$gt' => 1980})

次のコードに示すように、それぞれのフィールド名のシンボルのメソッドとしてクエリAPI演算子を指定できます。

Band.where(:founded.gt => 1980)

このセクションでは、さまざまなタイプの値を持つフィールドに対してクエリを実行する方法について説明します。

フィールドをクエリするには、フィールドはモデルクラス定義内に含まれている必要はありません。 ただし、 モデルクラスでフィールドが定義されている場合、Mongoid はクエリを構築するときに、定義されたフィールド型と一致するようにクエリ値を強制します。

次のコードでは、foundedフィールドをクエリするときに string 値を指定します。 foundedフィールドはモデルクラスで Integer 値を持つように定義されているため、クエリを実行するときに Mongoid は string '2020'2020 に強制します。

Band.where(founded: '2020')

Mongoid でフィールドを定義する方法の詳細については、「 フィールド タイプガイド 」を参照してください。

Mongoid のクエリ型強制動作をバイパスし、データベース内の未加工の型の値を直接クエリするには、次のコードに示すように、クエリ値を Mongoid::RawValueクラスでラップします。

Band.where(founded: Mongoid::RawValue('2020'))

クエリは、モデルクラス定義で設定したストレージフィールド名とフィールドエイリアスに従います。

id フィールドと _id フィールドはエイリアスであるため、クエリではどちらのフィールド名を使用できます。

Band.where(id: '5ebdeddfe1b83265a376a760')
Band.where(_id: '5ebdeddfe1b83265a376a760')

埋め込みドキュメントのフィールドの値をクエリするには、ドット表記 を使用できます。 次のコードは、埋め込み Managerドキュメントの nameフィールドが 'Smith' であるドキュメントを検索します。

Band.where('manager.name' => 'Smith')

次のコードは、埋め込みフィールドをクエリするときにシンボル演算子を使用する方法を示しています。

Band.where(:'manager.name'.ne => 'Smith')

注意

すべての条件が埋め込みドキュメントフィールドを参照場合でも、クエリは常に最上位のモデル インスタンスを返します。

Mongoid は、Criteria オブジェクトに対する次の論理操作をサポートしています。

  • and

  • or

  • nor

  • not

これらのメソッドは、1 つ以上の条件のハッシュまたは別の Criteriaオブジェクトを引数として受け取ります。 not操作には引数なしのバージョンがあります。

次のコードは、クエリで論理演算を使用する方法を示しています。

# Uses "and" to combine criteria
Band.where(label: 'Trust in Trance').and(name: 'Astral Projection')
# Uses "or" to specify criteria
Band.where(label: 'Trust in Trance').or(Band.where(name: 'Astral Projection'))
# Uses "not" to specify criteria
Band.not(label: 'Trust in Trance', name: 'Astral Projection')
# Uses "not" without arguments
Band.not.where(label: 'Trust in Trance', name: 'Astral Projection')

注意

配列パラメータ

以前の Mongoid バージョンとの下位互換性を確保するために、論理操作メソッドは基準を取得するためにフラット化されたパラメーターの配列を受け入れます。

論理演算に配列を渡すことは非推奨であり、将来のバージョンでは削除される可能性があります。

次のクエリは同じ条件を生成します。

# Conditions passed to separate "and" calls
Band.and(name: 'Sun Kil Moon').and(member_count: 2)
# Multiple conditions in the same "and" call
Band.and({name: 'Sun Kil Moon'}, {member_count: 2})
# Multiple conditions in an array - Deprecated
Band.and([{name: 'Sun Kil Moon'}, {member_count: 2}])
# Condition in "where" and a scope
Band.where(name: 'Sun Kil Moon').and(Band.where(member_count: 2))
# Condition in "and" and a scope
Band.and({name: 'Sun Kil Moon'}, Band.where(member_count: 2))
# Scope as an array element, nested arrays - Deprecated
Band.and([Band.where(name: 'Sun Kil Moon'), [{member_count: 2}]])

論理演算子は ActiveRecord の論理演算子と同じセマンティクスを持ちます。

次のコードのクエリに示すように、同じフィールドに条件が複数回指定されている場合、すべての条件が基準に追加されます。

# Combines as "and"
Band.where(name: 'Swans').where(name: 'Feist')
# Combines as "or"
Band.where(name: 'Swans').or(name: 'Feist')

any_ofnone_ofnornot の操作は同様に動作します。

andornor 論理演算子を使用する場合、それらはその点までに構築された基準に基づいて動作します 。

# "or" applies to the first condition, and the second is combined
# as "and"
Band.or(name: 'Sun').where(label: 'Trust')
# Same as previous example - "where" and "and" are aliases
Band.or(name: 'Sun').and(label: 'Trust')
# Same operator can be stacked any number of times
Band.or(name: 'Sun').or(label: 'Trust')
# The last label condition is added to the top level as "and"
Band.where(name: 'Sun').or(label: 'Trust').where(label: 'Feist')
# Interpreted query:
# {"$or"=>[{"name"=>"Sun"}, {"label"=>"Trust"}], "label"=>"Feist"}

引数なしで not メソッドを使用できます。その場合、指定された次の条件は否定されます。 not メソッドは、1 つ以上のハッシュ条件または Criteria オブジェクトを使用して呼び出すことができます。これらはすべて否定されて条件に追加されます。

次の例えは not の動作を示しています。

# "not" negates "where"
Band.not.where(name: 'Best')
# The second "where" is added as "$and"
Band.not.where(name: 'Best').where(label: /Records/)
# "not" negates its argument
Band.not(name: 'Best')

注意

MongoDBでは string 引数とともに $not 演算子を使用できません。 Mongoid では否定を実現するために $ne 演算子が使用されます。

# String negation - uses "$ne"
Band.not.where(name: 'Best')
# Regex negation - uses "$not"
Band.not.where(name: /Best/)

and と同様に、not操作は単純なフィールド基準の個々の条件を否定します。 複雑な条件の場合、およびフィールドにすでに条件が定義されている場合、Mongoid は {'$and' => [{'$nor' => ...}]} 構造を使用して $not をエミュレートします。これは、 MongoDB がグローバルではなくフィールドごとにのみ $not 演算子をサポートしているためです。

# Simple condition
Band.not(name: /Best/)
# Complex conditions
Band.where(name: /Best/).not(name: 'Astral Projection')
# Symbol operator syntax
Band.not(:name.ne => 'Astral Projection')

not配列または正規表現とともに$not を使用している場合は、サーバー マニュアルで の制限を参照してください。

デフォルトでは 、クエリに条件を追加すると、Mongoid は各条件が完了し、クエリ内に存在する他の条件から独立していると見なします。 例、in を 2 回呼び出すと、2 つの個別の $in 条件が追加されます。

Band.in(name: ['a']).in(name: ['b'])
# Interpreted query:
# {"name"=>{"$in"=>["a"]}, "$and"=>[{"name"=>{"$in"=>["b"]}}]}

一部の演算子メソッドは、条件を段階的にビルドすることをサポートしています。 サポートされている演算子の 1 つを使用する条件を追加すると、Mongoid は同じフィールドに同じ演算子を使用する条件が既に存在するかどうかを確認します。 その場合、指定された マージ戦略 に従って演算子式が結合されます。次のセクションでは、利用可能なマージ戦略について説明します。

Mongoid は、次のマージ戦略を提供します。

  • オーバーライド : 新しい演算子インスタンスは、同じ演算子を使用して同じフィールドの既存の条件を置き換えます。

  • 交差: 同じフィールドで同じ演算子を使用する条件が既に存在する場合、既存の条件の値と新しい条件の値が交差され、その結果が演算子値として保存されます。

  • 結合: 同じフィールドで同じ演算子を使用する条件が既に存在する場合、新しい条件の値が既存の条件の値に追加され、結果が演算子値として保存されます。

次のコードは、in を例の演算子として使用して、マージ戦略が条件を生成する方法を示しています。

Band.in(name: ['a']).override.in(name: ['b'])
# Interpreted query:
# {"name"=>{"$in"=>["b"]}}
Band.in(name: ['a', 'b']).intersect.in(name: ['b', 'c'])
# Interpreted query:
# {"name"=>{"$in"=>["b"]}}
Band.in(name: ['a']).union.in(name: ['b'])
# Interpreted query:
# {"name"=>{"$in"=>["a", "b"]}}

この戦略は、Criteria インスタンスで overrideintersect、または union を呼び出すことによってリクエストされます。リクエストされた戦略は、クエリで呼び出される次の条件メソッドに適用されます。次に呼び出される条件メソッドがマージ戦略をサポートしていない場合、次の例に示すように、戦略はリセットされます。

Band.in(name: ['a']).union.ne(name: 'c').in(name: ['b'])
# Interpreted query:
# {"name"=>{"$in"=>["a"], "$ne"=>"c"}, "$and"=>[{"name"=>{"$in"=>["b"]}}]}

ne はマージ戦略をサポートしていないため、union 戦略は無視され、リセットされます。 次に、in が 2 回目に呼び出されるときに、アクティブな戦略がありません。

警告

マージ戦略では、前の条件がクエリの最上位に追加されていることを前提としています。 ただし、これは常にそうであるとは限りません。条件は $and 句の下にネストされている場合があります。 複雑な条件でマージ戦略を使用すると、誤ったクエリが生成される可能性があります。

次の演算子メソッドはマージ戦略をサポートします。

  • all

  • in

  • nin

このメソッドのセットは、Mongoid の将来のリリースで拡張される可能性があります。 将来の互換性を確保するためには、次のメソッド呼び出しがマージ戦略をサポートする演算子である場合にのみ、戦略メソッドを呼び出します。

マージ戦略は、指定されたメソッドを通じて条件が追加された場合にのみ適用されます。 次の例では、2 つ目の条件が in ではなく where として追加されているため、マージ戦略は適用されません。

Band.in(name: ['a']).union.where(name: {'$in' => 'b'})
# Interpreted query:
# {"foo"=>{"$in"=>["a"]}, "$and"=>[{"foo"=>{"$in"=>"b"}}]}

マージ戦略をサポートする演算子メソッドは、値の型として Array を受け取ります。 Mongoid は、これらの演算子メソッドで使用される場合、Range などの Array 互換型を拡張します。

次の例では、 in メソッドを使用するときにクエリ値として Rangeオブジェクトを渡す方法を示しています。

Band.in(year: 1950..1960)
# Interpreted query:
# {"year"=>{"$in"=>[1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960]}}

Mongoid は、次の例に示すように、Array 以外の値を配列でラップします。

Band.in(year: 1950)
# Interpreted query: {"year"=>{"$in"=>[1950]}}

elem_match メソッドを使用して、指定されたすべてのクエリ条件に一致する要素が少なくとも 1 つ含まれる配列フィールドを含むドキュメントを検索できます。

次の例では、配列フィールドを含むサンプルドキュメントを作成します。 次に、elem_match メソッドを使用して、tour 配列フィールドに city 値が 'London' であるエントリを含むドキュメントを照合します。

aerosmith = Band.create!(name: 'Aerosmith', tours: [
{city: 'London', year: 1995},
{city: 'New York', year: 1999},
])
swans = Band.create!(name: 'Swans', tours: [
{city: 'Milan', year: 2014},
{city: 'Montreal', year: 2015},
])
# Returns only "Aerosmith"
Band.elem_match(tours: {city: 'London'})

埋め込み関連付けを一致させるには、elem_match メソッドを使用します。

この例では、 BandTour の間の埋め込み関連付けを定義する次のモデルを使用します。

class Band
include Mongoid::Document
field :name, type: String
embeds_many :tours
end
class Tour
include Mongoid::Document
field :city, type: String
field :year, type: Integer
embedded_in :band
end

次のコードでは、Bandオブジェクトと埋め込み Tour オブジェクトを作成し、elem_match メソッドを使用して cityフィールドをクエリします。

aerosmith = Band.create!(name: 'Aerosmith')
Tour.create!(band: aerosmith, city: 'London', year: 1995)
Tour.create!(band: aerosmith, city: 'New York', year: 1999)
# Returns the "Aerosmith" document
Band.elem_match(tours: {city: 'London'})

注意

MongoDB はコレクションに対して結合操作を実行しないため、非埋め込み関連付けでは elem_match を使用できません。 このクエリを実行すると、条件は、関連付けのコレクションではなく、非埋め込み関連付けのソースであるコレクションに追加されます。

次の例に示すように、elem_match を使用して再帰的に埋め込まれた関連付けをクエリできます。

class Tag
include Mongoid::Document
field name:, type: String
recursively_embeds_many
end
# Creates the root Tag
root = Tag.create!(name: 'root')
# Adds embedded Tags
sub1 = Tag.new(name: 'sub_tag_1', child_tags: [Tag.new(name: 'sub_sub_tag_1')])
root.child_tags << sub1
root.child_tags << Tag.new(name: 'sub_tag_2')
root.save!
# Searches for Tag in which one child Tag tame is "sub_tag_1"
Tag.elem_match(child_tags: {name: 'sub_tag_1'})
# Searches for a child Tag in which one child Tag tame is "sub_sub_tag_1"
root.child_tags.elem_match(child_tags: {name: 'sub_sub_tag_1'})

関連付けについて詳しくは、「 関連付けガイド 」を参照してください。

Mongoid は find メソッドを提供しており、これを使用すると _id 値でドキュメントをクエリできます。

次の例では、 find メソッドを使用して、指定された _idフィールド値を持つドキュメントを照合します。

Band.find('6725342d4cb3e161059f91d7')

注意

型の変換

ID値を find メソッドに渡すと、メソッドはそれをモデル内の _idフィールドに宣言されたデータ型に変換します。 デフォルトでは 、_idフィールドはBSON::ObjectId タイプとして定義されています。

上記の例は、次のコードと同等です。このコードでは、BSON::ObjectIdインスタンスが引数として find に渡されます。

Band.find(BSON::ObjectId.from_string('5f0e41d92c97a64a26aabd10'))

Rubyドライバーを使用して _idフィールドをクエリする場合、find は型変換を内部的に実行しません。

find メソッドは複数の引数、または引数の配列を受け入れます。 Mongoid は、次の例に示すように、各引数または配列要素を _id 値として解釈し、指定されたすべての _id 値を持つドキュメントを配列で返します。

# Equivalent ways to match multiple documents
Band.find('5f0e41d92c97a64a26aabd10', '5f0e41b02c97a64a26aabd0e')
Band.find(['5f0e41d92c97a64a26aabd10', '5f0e41b02c97a64a26aabd0e'])

find メソッドは、次の動作を示します。

  • 同じ _id 値を複数回指定した場合、Mongoid は 1 つのドキュメント(存在する場合)のみを返します。

  • Mongoid では、ドキュメントは順序付けられた方法で返されることはありません。 ドキュメントは、指定された _id 値の順序とは異なる順序で返される場合があります。

  • _id 値のいずれかがデータベースで見つからない場合、結果は raise_not_found_error 構成オプションの値によって異なります。

    raise_not_found_error オプションを true に設定している場合、_id 値のいずれかが見つからない場合は、findMongoid::Errors::DocumentNotFound エラーを発生させます。

    raise_not_found_error オプションを false に設定し、単一の _id 値をクエリすると、Mongoid がドキュメントと一致しない場合、findnil を返します。 複数の _id 値を渡し、一部またはすべてが一致しない場合、戻り値は一致するドキュメントの配列になり、一致するドキュメントがない場合は空の配列になります。

このセクションでは、前のセクションで説明した find メソッドと同様のメソッドについて説明します。

find_by メソッドを使用して、指定された条件に基づいてドキュメントを取得できます。 ドキュメントが見つからない場合は、raise_not_found_error 構成オプションの設定方法に応じてエラーが発生するか、nil が返されます。

次のコードは、find_by メソッドを使用する方法を示しています。

# Simple equality query
Band.find_by(name: "Photek")
# Performs an action on each returned result
Band.find_by(name: "Tool") do |band|
band.fans += 1
end

find_or_create_by メソッドを使用して、指定された条件に基づいてドキュメントを取得できます。 ドキュメントが見つからない場合は、 MongoDBに保存されたインスタンスが作成されて返されます。

次のコードは、find_or_create_by メソッドを使用する方法を示しています。

# If no matches, creates a Band with just the "name" field
Band.find_or_create_by(name: "Photek")
# If no matches, creates a Band with just the "name" field because the
# query condition is not a literal
Band.where(:likes.gt => 10).find_or_create_by(name: "Photek")
# Creates a Band in which the name is Aerosmith because there is no
# document in which "name" is Photek and Aerosmith at the same time
Band.where(name: "Photek").find_or_create_by(name: "Aerosmith")

find_or_initialize_by メソッドを使用して、指定された条件に基づいてドキュメントを取得できます。 ドキュメントが見つからない場合は、 MongoDBに永続化せずに新しいドキュメントが返されます。 find_or_initialize_by には find_or_create_by メソッドと同じ構文を使用します。

Mongoid では、フィルター条件で正規表現を使用してドキュメントをクエリできます。

次のコードは、サンプルBand モデルを作成します。

Band.create!(name: 'Tame Impala', description: "Tame\nImpala is an American band")

次のコードに示すように、 Ruby正規表現を使用してクエリを実行できます。

# Matches documents in which the "name" field includes the string "impala"
Band.where(name: /impala/i)
# => Returns sample document

Perl互換正規表現(PCRE)構文と BSON::Regexp::Raw オブジェクトを使用してクエリを実行することもできます。

# Matches "description" values that start exactly with "Impala"
Band.where(description: /\AImpala/)
# => nil
# Matches "description" values that start exactly with "Impala"
Band.where(description: BSON::Regexp::Raw.new('^Impala'))
# => nil
# Matches "description" values that start exactly with "Impala" with
# the multiline option
Band.where(description: BSON::Regexp::Raw.new('^Impala', 'm'))
# => Returns sample document

モデルで定義されたフィールドにクエリを指定すると、フィールドに指定されたデータ型がある場合、Mongoid はフィールドが定義されている方法に基づいてクエリ値を変換します。

次の Album モデル定義には、Date 値フィールド、Time 値フィールド、暗黙的な Object 値フィールドが含まれています。 またモデルでは という名前のフィールドも意図的に定義されていません。last_reviewed

class Album
include Mongoid::Document
field :release_date, type: Date
field :last_commented, type: Time
field :last_purchased
end

次のコードに示すように、DateTime の値を使用して、release_date フィールドと last_commented フィールドをクエリできます。

Album.where(release_date: Date.today)
# Interpreted query:
# {"release_date"=>2024-11-05 00:00:00 UTC}
Album.where(last_commented: Time.now)
# Interpreted query:
# {"last_commented"=>2024-11-04 17:20:47.329472 UTC}

ただし、他の型として定義されたフィールドで Date 値のみを使用してクエリを実行すると、生成されたクエリには次の例に示すように、デフォルトの変換動作が表示されます。

Album.where(last_commented: Date.today)
# Interpreted query:
# {"last_commented"=>Mon, 04 Nov 2024 00:00:00.000000000 EST -05:00}
Album.where(last_purchased: Date.today)
# Interpreted query:
# {"last_purchased"=>"2024-11-04"}
Album.where(last_reviewed: Date.today)
# Interpreted query:
# {"last_reviewed"=>2024-11-04 00:00:00 UTC}

前の例では、次の変換が適用されます。

  • Date値を使用して 値のTime last_commentedフィールド をクエリする場合、Mongoid は日付をローカル時間と解釈し、構成された タイムゾーンを適用します。

  • 明示的な型がない last_purchasedフィールドをクエリする場合、構築されたクエリで日付が変更されずに使用されます。

  • 未定義の last_reviewedフィールドをクエリする場合、Mongoid は Date が UTC であると解釈し、時間に変換し、release_date などの Date 値フィールドをクエリする動作と一致します。

このセクションでは、Mongoid で使用できるその他のクエリ メソッドについて説明します。

コレクション内のドキュメントの数をカウントするには、count メソッドと estimated_count メソッドを使用します。

count メソッドを使用して、フィルタ条件に一致するドキュメントの数をカウントできます。

# Counts all documents in collection
Band.count
# Counts documents that match criteria
Band.where(country: 'England').count

Tip

長さメソッドとサイズメソッド

また、length または size メソッドを使用してドキュメントをカウントすることもできます。 これらのメソッドはデータベースへの後続の呼び出しをキャッシュ、パフォーマンスが向上する可能性があります。

estimated_count メソッドを使用して、コレクションメタデータからコレクション内のドキュメントのおおよその数を取得できます。

Band.estimated_count

estimated_countメソッドは、モデルのスコープによって設定された条件を含む、クエリ条件を受け入れません。デフォルトのスコープを持つモデルでこのメソッドを呼び出す場合は、まず unscoped メソッドを呼び出してスコープを無効にする必要があります。

次のリストで説明されているメソッドを使用すると、位置に基づいて返されたドキュメントのリストから特定の結果を選択できます。

  • first: 最初に一致するドキュメントを返します。 整数値のパラメータを渡すことで、最初の n ドキュメントを取得できます。 このメソッドは、_idフィールドでのソートを自動的に使用します。 例については、次のコードの ~ 行を参照してください。18

  • last: 最後に一致したドキュメントを返します。 整数値のパラメータを渡すことで、最後の n ドキュメントを取得できます。 このメソッドは、_idフィールドでのソートを自動的に使用します。 11の例については、次のコードの 行を参照してください。

  • first_or_create: 最初に一致するドキュメントを返します。 一致するドキュメントがない場合、 は新しく保存されたドキュメントを作成して返します。

  • first_or_initialize: 最初に一致するドキュメントを返します。 一致するドキュメントがない場合は、新しいドキュメントを返します。

  • second: 2 番目に一致するドキュメントを返します。 _idフィールドでのソートを自動的に使用します。

  • third: 3 番目に一致するドキュメントを返します。 _idフィールドでのソートを自動的に使用します。

  • fourth: 一致する 4 番目のドキュメントを返します。 _idフィールドでのソートを自動的に使用します。

  • fifth: 一致する 5 番目のドキュメントを返します。 _idフィールドでのソートを自動的に使用します。

  • second_to_last: 最後から 2 番目に一致するドキュメントを返します。 _idフィールドでのソートを自動的に使用します。 14の例については、次のコードの 行を参照してください。

  • third_to_last: 最後から 3 番目に一致するドキュメントを返します。 _idフィールドでのソートを自動的に使用します。

次のコードは、前述のリストで説明されているいくつかのメソッドを使用する方法を示しています。

1# Returns the first document in the collection
2Band.first
3
4# Returns the first matching document
5Band.where(founded: {'$gt' => 1980}).first
6
7# Returns the first two matching documents
8Band.first(2)
9
10# Returns the last matching document
11Band.where(founded: {'$gt' => 1980}).last
12
13# Returns the second to last document
14Band.second_to_last

Tip

エラー生成

このセクションで説明される各メソッドには、Mongoid がどのドキュメントにも一致しない場合にエラーを返す ! が接頭辞として含まれているバリエーションがあります。 例、クエリが結果を返さない場合にアプリケーションにエラー処理を実装するには、first ではなく first! メソッドを使用します。

コレクション内のドキュメントの指定されたフィールドの値を検査するには、次のメソッドを使用できます。

  • distinct: 単一のフィールドの個別の値のリストを取得します。 例については、次のコードの - 行を参照してください。17

  • pick: 指定されたフィールドの値を 1 つのドキュメントから取得します。 設定されていないフィールドおよび存在しないフィールドの場合は nil を返します。 10の例については、次のコードの 行を参照してください。

  • pluck: 指定されたフィールドのすべての値を取得します。 設定されていないフィールドおよび存在しないフィールドの場合は nil を返します。 13の例については、次のコードの 行を参照してください。

  • tally: 指定されたフィールドの値とカウントのマッピングを取得します。 16の例については、次のコードの 行を参照してください。

上記のメソッドはドット表記を使用して参照されるフィールド名を受け入れます。これにより、埋め込まれた関連付け内のフィールドを参照できます。 また、埋め込みドキュメントで定義されているフィールドエイリアス も尊重します。

次のコードは、これらのメソッドの使用方法を示しています。

1Band.distinct(:name)
2# Example output: "Ghost Mountain" "Hello Goodbye" "She Said"
3
4Band.where(:members.gt => 2).distinct(:name)
5# Example output: "Arctic Monkeys" "The Smiths"
6
7Band.distinct('tours.city')
8# Example output: "London" "Sydney" "Amsterdam"
9
10Band.all.pick(:name)
11# Example output: "The Smiths"
12
13Band.all.pluck(:country)
14# Example output: "England" "Spain" "England" "Japan"
15
16Band.all.tally(:country)
17# Example output: ["England",2] ["Italy",3]

次のリストでは、別のカテゴリに分類されない Mongoid メソッドを説明します。

  • each: 一致するすべてのドキュメントを反復処理します。

# Print each matching document "name" to console
Band.where(:members.gt => 1).each do |band|
p band.name
end
  • exists?: 一致するドキュメントが存在するかどうかを判断し、一致するドキュメントが少なくとも 1 つ見つかった場合は true を返します。

# Checks existence of any document
Band.exists?
# Checks existence based on query
Band.where(name: "Le Tigre").exists?
Band.exists?(name: "Le Tigre")
# Checks existence based on "_id" value
Band.exists?('6320d96a3282a48cfce9e72c')
# Always returns false
Band.exists?(false)
Band.exists?(nil)

Mongoid が結果を返す方法を変更する方法については、「 クエリ結果の変更 」を参照してください。

モデルにスコープを定義する方法の詳細については、「 スコープ設定 」を参照してください。

クエリに連結してデータを保持できるメソッドの詳細については、「 クエリからのデータの永続化 」を参照してください。

クエリキャッシュの機能について詳しくは、「 クエリ キャッシュ 」を参照してください。

非同期クエリの実行の詳細については、「 非同期クエリ 」を参照してください。

戻る

データ操作の実行