クエリを指定する
項目一覧
Overview
このガイドでは、Mongoid を使用してクエリを指定する方法を学習できます。
クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。クエリフィルターは、 MongoDB が読み取りまたは書込み (write)操作においてドキュメントを照合するために使用する検索条件を指定する式です。 クエリフィルター を作成するときに、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressためにクエリフィルターを作成することもできます。
Mongoid は、Active レコードで使用されるのと同様のクエリ ドメイン固有言語(DSL)を提供します。
サンプル データ
このガイドの例では、バンドまたはステージを表す Band
モデルを使用します。 Band
モデルの定義は、異なるクエリ機能を示すために、各セクションで異なる場合があります。 一部のセクションでは、クエリ機能を示すために他のモデルを使用する場合があります。
Mongoid のクエリ
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"}]
個々のドキュメントを返すには、first
や last
などのメソッドを使用します。 また、each
や map
などのメソッドを使用して 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')
クエリAPIシンタックス
次の同等のクエリに示すように、 ハッシュ構文 を使用して任意のフィールドに 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 でフィールドを定義する方法の詳細については、「 フィールド タイプガイド 」を参照してください。
Raw Values
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_of
、none_of
、nor
、not
の操作は同様に動作します。
and
、or
、nor
論理演算子を使用する場合、それらはその点までに構築された基準に基づいて動作します 。
# "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
インスタンスで override
、intersect
、または 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
メソッドを使用します。
この例では、 Band
と Tour
の間の埋め込み関連付けを定義する次のモデルを使用します。
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'})
_id 値によるクエリ
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
値のいずれかが見つからない場合は、find
はMongoid::Errors::DocumentNotFound
エラーを発生させます。raise_not_found_error
オプションをfalse
に設定し、単一の_id
値をクエリすると、Mongoid がドキュメントと一致しない場合、find
はnil
を返します。 複数の_id
値を渡し、一部またはすべてが一致しない場合、戻り値は一致するドキュメントの配列になり、一致するドキュメントがない場合は空の配列になります。
find バリエーション
このセクションでは、前のセクションで説明した 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
次のコードに示すように、Date
と Time
の値を使用して、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
フィールドでのソートを自動的に使用します。 例については、次のコードの ~ 行を参照してください。18last
: 最後に一致したドキュメントを返します。 整数値のパラメータを渡すことで、最後の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 2 Band.first 3 4 # Returns the first matching document 5 Band.where(founded: {'$gt' => 1980}).first 6 7 # Returns the first two matching documents 8 Band.first(2) 9 10 # Returns the last matching document 11 Band.where(founded: {'$gt' => 1980}).last 12 13 # Returns the second to last document 14 Band.second_to_last
Tip
エラー生成
このセクションで説明される各メソッドには、Mongoid がどのドキュメントにも一致しない場合にエラーを返す !
が接頭辞として含まれているバリエーションがあります。 例、クエリが結果を返さない場合にアプリケーションにエラー処理を実装するには、first
ではなく first!
メソッドを使用します。
フィールド値を調査
コレクション内のドキュメントの指定されたフィールドの値を検査するには、次のメソッドを使用できます。
distinct
: 単一のフィールドの個別の値のリストを取得します。 例については、次のコードの - 行を参照してください。17pick
: 指定されたフィールドの値を 1 つのドキュメントから取得します。 設定されていないフィールドおよび存在しないフィールドの場合はnil
を返します。 10の例については、次のコードの 行を参照してください。pluck
: 指定されたフィールドのすべての値を取得します。 設定されていないフィールドおよび存在しないフィールドの場合はnil
を返します。 13の例については、次のコードの 行を参照してください。tally
: 指定されたフィールドの値とカウントのマッピングを取得します。 16の例については、次のコードの 行を参照してください。
上記のメソッドはドット表記を使用して参照されるフィールド名を受け入れます。これにより、埋め込まれた関連付け内のフィールドを参照できます。 また、埋め込みドキュメントで定義されているフィールドエイリアス も尊重します。
次のコードは、これらのメソッドの使用方法を示しています。
1 Band.distinct(:name) 2 # Example output: "Ghost Mountain" "Hello Goodbye" "She Said" 3 4 Band.where(:members.gt => 2).distinct(:name) 5 # Example output: "Arctic Monkeys" "The Smiths" 6 7 Band.distinct('tours.city') 8 # Example output: "London" "Sydney" "Amsterdam" 9 10 Band.all.pick(:name) 11 # Example output: "The Smiths" 12 13 Band.all.pluck(:country) 14 # Example output: "England" "Spain" "England" "Japan" 15 16 Band.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 が結果を返す方法を変更する方法については、「 クエリ結果の変更 」を参照してください。
モデルにスコープを定義する方法の詳細については、「 スコープ設定 」を参照してください。
クエリに連結してデータを保持できるメソッドの詳細については、「 クエリからのデータの永続化 」を参照してください。
クエリキャッシュの機能について詳しくは、「 クエリ キャッシュ 」を参照してください。
非同期クエリの実行の詳細については、「 非同期クエリ 」を参照してください。