Docs Menu
Docs Home
/ / /
Rust ドライバー
/ / /

クエリを指定する

項目一覧

  • Overview
  • サンプル データ
  • リテラル値
  • 比較
  • 論理
  • 要素
  • 評価
  • Bitwise
  • 配列
  • 詳細情報

このガイドでは、ドキュメントのサブセットに一致するクエリを指定する方法について説明します。

文書のサブセットをマッチングするには、一致条件を含むクエリフィルターを指定します。 一致基準は、一致するドキュメントを取得するフィールドと値で構成されます。 クエリフィルターには、返されるドキュメントを決定するための一致条件を少なくとも 1 セット含めます。 検索操作で空のクエリフィルターを使用すると、ドライバーはコレクション内のすべてのドキュメントを照合します。

クエリ フィルターでは、フィールドをリテラル値または クエリ演算子 と一致させることができます。 クエリ演算子を使用すると、数学的操作や論理的操作を実行してコレクション内のドキュメントを検索できます。

リテラル値を使用してドキュメントを一致させるには、次の形式を使用します。

let filter = doc! { "<field>": "<value>" };

クエリ演算子を含む一致条件を作成するには、次の形式を使用します。

let filter = doc! { "<field>": doc! { "<operator>": "<value>" } };

次のセクションの例は、 find()メソッドを使用してコレクション内のドキュメントを一致させるクエリを指定する方法を示しています。

このガイドには、次のセクションが含まれています。

  • 例のサンプル データ では、クエリ例で使用されるサンプル データが

  • リテラル値では、クエリフィルターで指定した値と完全に一致するデータをクエリする方法について説明します

  • 比較では、コレクション内の値との比較に基づいてデータをクエリする方法について説明します。

  • フィールドレベルの演算子の結果に適用されたロジックを使用してデータをクエリする方法について論理的に説明します

  • 要素は、フィールドの存在、不在、または型に基づいてクエリを実行する方法を説明します

  • 評価は、コレクション内のドキュメントをクエリするときに、正規表現やテキスト検索などの高レベルのロジックを実行する方法を説明します

  • ビットは、基本の10値の同等のビットセットに基づいてクエリを実行する方法を説明します

  • 配列は、配列値フィールド内のデータに基づいてコレクションをクエリする方法を説明します

  • 追加情報では、このガイドで言及されている型とメソッドのリソースとAPIドキュメントへのリンクを提供します

このガイドの例では、次のサンプル ドキュメントを使用します。 各ドキュメントは、店舗の在庫内の品種を表し、その数量に関する情報が含まれています。 一部のドキュメントには、品種またはその販売業者を説明するフィールドが含まれています。

#[derive(Serialize, Deserialize, Debug)]
struct Fruit {
_id: String,
name: String,
quantity: i32,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
vendors: Option<Vec<String>>
}

次のセクションの例では、 Fruit構造体によって記述されたドキュメントのコレクションをクエリします。

let docs = vec! [
Fruit {
_id: 1.to_string(),
name: "orange".to_string(),
quantity: 7,
description: None,
vendors: None
},
Fruit {
_id: 2.to_string(),
name: "apple".to_string(),
quantity: 4,
description: Some("Granny Smith".to_string()),
vendors: None
},
Fruit {
_id: 3.to_string(),
name: "banana".to_string(),
quantity: 36,
description: None,
vendors: None
},
Fruit {
_id: 4.to_string(),
name: "pear".to_string(),
quantity: 28,
description: None,
vendors: vec!["A".to_string(), "C".to_string() ].into()
},
];

このデータをコレクションに挿入する方法については、 ドキュメントの挿入ガイドを参照してください。

リテラル値クエリフィルターを使用すると、クエリフィルターで指定した値と完全に一致するデータをクエリできます。 次の操作では、リテラル クエリを使用して、値が"pear"であるnameというフィールドを含むドキュメントを検索します。

let query = doc! { "name": "pear" };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

注意

リテラル値クエリは、 $eq比較演算子を使用するクエリと同じように機能します。 たとえば、次のクエリは同等です。

my_coll.find(doc! {
"price": doc! { "$eq": 5 }
}).await?;
my_coll.find(doc! {
"price": 5
}).await?;

比較演算子を使用すると、クエリフィルター内の値と比較してドキュメントをクエリできます。 一般的な比較演算子には、「より大きい」比較用の$gt 、「より小さい」比較用の$lt 、「等しくない」比較用の$neなどがあります。

次の操作では、比較演算子$gtを使用して、 quantityの値が5より大きいドキュメントを照合します。

// $gt means "greater than"
let query = doc! { "quantity": doc! { "$gt": 5 } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None }
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

比較演算子の詳細については、サーバー マニュアルの「比較クエリ演算子」を参照してください。

論理演算子には少なくとも 2 つの一致条件が必要であり、これらの条件の一部を満たすドキュメント、すべてを満たすドキュメント、またはまったく満たさないドキュメントと一致させることができます。 たとえば、論理演算子$orを使用して、 $gt (より大きい)比較演算子またはリテラル値クエリのいずれかに一致するドキュメントをクエリできます。

次の操作では、論理演算子 を使用して、$and quantity10より大きく、 で割り切れる3 値を持つドキュメントを一致させます。

let query =
doc! { "$and": [
doc! { "quantity": doc! { "$gt": 10 } },
doc! { "quantity": doc! { "$mod": [ 3, 0 ] } }
]
};
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }

注意

クエリフィルターに複数のフィールド値のペアを持つリテラル値クエリがクエリフィルターに含まれている場合、ドライバーはすべての条件を満たすドキュメントを照合します。

たとえば、次のクエリでは同等の結果が生成されます。

my_coll.find(doc! {
"price": doc! { "$eq": 5 },
"quantity": doc! { "$gt": 4 }
});
my_coll.find(doc! {
"$and": [
doc! { "price": { "$eq": 5 }},
doc! { "quantity": { "$gt": 4 }}
]
});

論理演算子の完全なリストについては、サーバー マニュアルの「論理クエリ演算子」を参照してください。

要素演算子を使用すると、指定されたフィールドの型に基づいて、または指定されたフィールドが含まれている場合にドキュメントを一致させることができます。

次の操作では、要素演算子 $exists を使用して、description フィールドを含むドキュメントを検索します。

let query = doc! { "description": doc! { "$exists": true } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "2", name: "apple", quantity: 4, description: Some("Granny Smith"),
vendors: None }

注意

このガイドのドキュメントを説明する実稼働構造体は、フィールドの 2 つので#[serde(skip_serializing_if = "Option::is_none")]属性を使用しています。 この属性は、値がNoneの場合、フィールドを無視することを指定します。 descriptionこれにより、 の 値がNone $existsクエリで返されなくなります。

Serialize_with を参照してください 詳細については、serde 属性を参照してください。

要素演算子の完全なリストについては、サーバー マニュアルの「要素クエリ演算子」を参照してください。

評価演算子は、個々のフィールドまたはコレクションのドキュメントを分析して、特定の条件を満たすかどうかを判断します。 各評価演算子は異なる関数を実行します。 たとえば、 $mod演算子はフィールド値に対して数学演算を実行し、 $where演算子を使用すると JavaScript 式に対して値を評価できます。

次の操作では、評価演算子$modを使用して、3 で割り切れるquantity値を持つドキュメントを検索します。

// $mod means "modulo" and checks if the remainder is a specific value
let query = doc! { "quantity": doc! { "$mod": [ 3, 0 ] } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "3", name: "banana", quantity: 36, description: None, vendors: None }

評価演算子の完全なリストについては、サーバー マニュアルの「評価クエリ演算子」を参照してください。

ビット演算子は、数値フィールドを 10 進数の数値から対応する 2 進数に変換します。ドキュメント内の値に、一致条件の値と同じビットが設定されているかどうかを確認します。

次の例では、 quantity7と同じビット(バイナリでは00000111と同等)に設定されているドキュメントをマッチングしています。

let query = doc! { "quantity": doc! { "$bitsAllSet": 7 } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "1", name: "orange", quantity: 7, description: None, vendors: None }

ビット演算子の完全なリストについては、サーバー マニュアルの「ビット クエリ演算子」を参照してください。

配列演算子は、配列値フィールド内の要素の値または量をチェックします。

次の例では、 vendor配列フィールドに"C"が含まれるドキュメントをマッチングしています。

let query = doc! { "vendors": doc! { "$elemMatch": { "$eq": "C" } } };
let mut cursor = my_coll.find(query).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Fruit { _id: "4", name: "pear", quantity: 28, description: None, vendors: Some(["A", "C"]) }

ビット演算子の完全なリストについては、サーバー マニュアルの「配列クエリ演算子」を参照してください。

検索操作の詳細については、「データの取得」ガイドを参照してください。

クエリ演算子の詳細については、サーバー マニュアルの「クエリ セレクター」を参照してください。

このガイドで使用されているメソッドとタイプの詳細については、次の API ドキュメントを参照してください。

戻る

Retrieve Data