Overview
このガイドでは、 Rubyドライバーを使用してクエリを指定する方法を学習できます。
クエリフィルターを作成することで、クエリが返すドキュメントのセットを絞り込むことができます。 クエリフィルターは、読み取りまたは書込み操作においてドキュメントを照合するためにMongoDBが使用する検索条件を指定する式です。 クエリフィルターでは、クエリに完全に一致するドキュメントを検索するようにドライバーに指示することも、より複雑な一致条件をExpressするためにクエリフィルターを作成することもできます。
サンプル データ
このガイドの例では、実稼働ドキュメントを含む fruits
コレクションに対して操作を実行します。次のコード例は、データベースとコレクションを作成し、サンプルドキュメントをコレクションに挿入する方法を示しています。
database = client.use('db') collection = database[:fruits] # Inserts documents representing fruits fruits = [ { _id: 1, name: 'apples', qty: 5, rating: 3, color: 'red', type: ['fuji', 'honeycrisp'] }, { _id: 2, name: 'bananas', qty: 7, rating: 4, color: 'yellow', type: ['cavendish'] }, { _id: 3, name: 'oranges', qty: 6, rating: 2, type: ['naval', 'mandarin'] }, { _id: 4, name: 'pineapples', qty: 3, rating: 5, color: 'yellow' } ] collection.insert_many(fruits)
完全一致
リテラル値クエリは、クエリフィルターに完全に一致するドキュメントを返します。
次の例では、 find
メソッドのパラメーターとしてクエリフィルターを指定します。 このコードでは、 color
フィールドの値が'yellow'
であるすべてのドキュメントが返されます。
filter = { color: 'yellow' } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
注意
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、パラメータを渡しずに find
メソッドを呼び出します。
results = collection.find
比較演算子
比較演算子は、ドキュメントフィールド値をクエリフィルター内の指定された値に対して評価します。次のリストでは、一般的な比較演算子について説明します。
$gt
: 指定したフィールドの値が指定した値を超えるドキュメントを返します$lte
: 指定されたフィールドの値が指定された値以下のドキュメントを返します$ne
: 指定されたフィールドの値が指定された値と等しくないドキュメントを返します
Tip
比較演算子の完全なリストを表示するには、 マニュアルの「 比較クエリ演算子 」MongoDB Server ガイドを参照してください。
次の例では、クエリフィルター内の 比較演算子をfind
メソッドへのパラメーターとして指定しています。 コードは、 rating
フィールドの値が2
より大きいすべてのドキュメントを返します。
filter = { rating: { '$gt' => 2 } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
論理演算子
論理演算子は、2 つ以上の式のセットの結果に適用されたロジックを使用してドキュメントを一致させます。 以下のリストは、各論理演算子について説明します。
$and
: すべての句の条件に一致するドキュメントを返します$or
: 1 つの句の条件に一致するドキュメントを返します$nor
: どの句の条件にも一致しないドキュメントを返します$not
: 式に一致しないドキュメントを返します
次の例では、クエリフィルターで論理演算子を find
メソッドへのパラメーターとして指定します。コードでは、qty
フィールドの値が 5
より大きいか、color
のフィールド値が 'yellow'
であるすべてのドキュメントが返されます。
filter = { '$or' => [{ qty: { '$gt' => 5 } }, { color: 'yellow' }] } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>3, "name"=>"oranges", "qty"=>6, "rating"=>2, "type"=>["naval", "mandarin"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
配列演算子
配列演算子は、 配列フィールド内の要素の値または量に基づいてドキュメントを一致させます。以下のリストは、各配列演算子について説明します。
$all
: クエリ内のすべての要素を含む配列を持つドキュメントを返します$elemMatch
: 配列フィールド内の要素がクエリ内のすべての条件に一致する場合にドキュメントを返します$size
: 指定されたサイズの配列を持つドキュメントを返します
次の例では、クエリフィルター内の配列演算子をfind
メソッドへのパラメーターとして指定しています。 このコードでは、 type
配列フィールドに2
要素が含まれるすべてのドキュメントが返されます。
filter = { type: { '$size' => 2 } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>3, "name"=>"oranges", "qty"=>6, "rating"=>2, "type"=>["naval", "mandarin"]}
要素演算子
要素演算子は、フィールドの存在または型に基づいてデータをクエリします。以下のリストは各要素演算子について説明しています。
$exists
: 指定したフィールドを含むドキュメントを返します$type
: 指定した型のフィールドを含むドキュメントを返します
次の例では、クエリフィルター内の要素演算子をfind
メソッドへのパラメーターとして指定しています。 このコードでは、 color
フィールドを持つすべてのドキュメントが返されます。
filter = { color: { '$exists' => true } } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>2, "name"=>"bananas", "qty"=>7, "rating"=>4, "color"=>"yellow", "type"=>["cavendish"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
評価演算子
評価演算子は、個々のフィールドまたはコレクションのドキュメント全体の評価に基づいてデータを返します。次のリストでは、一般的な要素演算子について説明します。
$text
: ドキュメントに対してテキスト検索を実行します$regex
: 指定された正規式に一致するドキュメントを返します$mod
:フィールド値に対して剰余操作を実行し、余りが指定された値であるドキュメントを返します
Tip
評価演算子の完全なリストを表示するには、 マニュアルの「 評価クエリ演算子MongoDB Server 」ガイドを参照してください。
次の例では、クエリフィルターで評価演算子をfind
メソッドへのパラメーターとして指定しています。 このコードでは正規式を使用して、 name
フィールド値に少なくとも 2 文字の連続した'p'
文字があるすべてのドキュメントを返します。
filter = { name: /p{2,}/ } results = collection.find(filter) results.each do |doc| puts doc end
{"_id"=>1, "name"=>"apples", "qty"=>5, "rating"=>3, "color"=>"red", "type"=>["fuji", "honeycrisp"]} {"_id"=>4, "name"=>"pineapples", "qty"=>3, "rating"=>5, "color"=>"yellow"}
注意
Rubyドライバーは、前述の例に示すように、クエリフィルターに正規式の値が含まれている場合、暗黙的に $regex
演算子を使用します。
詳細情報
ドキュメントのクエリの詳細については、 MongoDB Serverマニュアルの ドキュメントのクエリ を参照してください。
Rubyドライバーを使用してドキュメントを取得する方法の詳細については、データの取得ガイドをご覧ください。
API ドキュメント
find
メソッドの詳細については、APIドキュメントを参照してください。