AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

ドキュメントの検索

このガイドでは、読み取り操作を使用して MongoDB コレクションからデータを検索する方法を学びます。 読み取り操作は、サーバーからドキュメントを検索するコマンドです。

読み取り操作には次の 2 つのタイプがあります。

  • 検索操作: コレクションからドキュメントを検索できます

  • 集計操作: コレクション内のデータを変換

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

  • 例のサンプル データ では、読み取り操作の例で使用されるサンプル データが提示されます

  • 検索操作では、ドライバーを使用して検索操作を実行する方法について説明します

  • 「集計操作」では、ドライバーを使用して集計操作を実行する方法について説明します

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

このガイドの例では、次のサンプルドキュメントを使用します。各ドキュメントは、店舗の在庫内の商品を表し、その分類と単価に関する情報が含まれています。

let docs = vec![
Inventory {
item: "candle".to_string(),
category: "decor".to_string(),
unit_price: 2.89,
},
Inventory {
item: "blender".to_string(),
category: "kitchen".to_string(),
unit_price: 38.49,
},
Inventory {
item: "placemat".to_string(),
category: "kitchen".to_string(),
unit_price: 3.19,
},
Inventory {
item: "watering can".to_string(),
category: "garden".to_string(),
unit_price: 11.99,
},
];

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

検索操作を使用して、MongoDB からデータを取得します。 find()検索操作は、find_one() メソッドと メソッドで構成されています。

条件に一致するすべてのドキュメントを検索するには、 find()メソッドを使用します。 このメソッドは、クエリフィルターをパラメーターとして受け取ります。 クエリフィルターは、一致するドキュメントの基準を形成するフィールドと値で構成されます。

メソッドは、フィルタ条件に一致するドキュメントを検索するために反復処理できるCursorタイプを返します。

このメソッドを使用してデータを検索する例については、 find() の例 を参照してください。

クエリの指定の詳細については、「 クエリの指定 」ガイドを参照してください。

条件に一致する最初のドキュメントを検索するには、 find_one()メソッドを使用します。 このメソッドは、クエリフィルターをパラメーターとして受け取ります。 クエリフィルターは、一致するドキュメントの基準を形成するフィールドと値で構成されます。

ドキュメントがフィルタ条件に一致する場合、メソッドはSomeの値を持つResult<Option<T>>型を返します。 フィルタ条件に一致するドキュメントがない場合、 find_one()Noneの値を持つResult<Option<T>>型を返します。

このメソッドを使用してデータを検索する例については、 find_one() の例 を参照してください。

FindOptionsオプション ビルダー メソッドをfind()に連鎖させることで、 find()メソッドの動作を変更できます。また、 FindOneOptionsオプション ビルダー メソッドをfind_one()に連鎖させることで、 find_one()メソッドの動作を変更できます。

次の表では、対応するビルダFindOptions FindOneOptionsメソッドを呼び出して設定できる一般的に使用される フィールドと フィールドについて説明しています。

フィールド
説明

collation

結果をソートするときに使用する照合。照合について詳しくは、「照合」ガイドを参照してください。

タイプ: Collation
デフォルト: None

hint

操作に使用するインデックス。インデックスの詳細については、サーバー マニュアルの「インデックス」を参照してください。

タイプ: Hint
デフォルト: None

projection

結果を返すときに使用するプロジェクション。プロジェクションの詳細については、「返すフィールドの指定」ガイドを参照してください。

タイプ: Document
デフォルト: None

read_concern

検索操作に使用する読み取り保証 (read concern)。このオプションを設定しない場合、操作はコレクションに設定された読み取り保証 (read concern)を継承します。読み取り保証 (read concern) の詳細については、サーバーマニュアルの「読み取り保証 (read concern)」を参照してください。

タイプ: ReadConcern

skip

結果を返す前にスキップするドキュメントの数。skip() ビルダメソッドの使用方法の詳細については、スキップを参照してください。

タイプ: u64
デフォルト: None

sort

結果を返すときに使用するソート。デフォルトでは、ドライバーはドキュメントを自然な順序、つまりデータベースに表示される順序で返します。詳細については、サーバー マニュアルの用語集にある「自然な順序」を参照してください。sort() ビルダ メソッドの使用方法について詳しくは、Sort を参照してください。

タイプ: Document
デフォルト: None

注意

設定オプション

FindOptionsFindOneOptionsオプション ビルダのメソッドを検索操作メソッド呼び出しに直接連結することで、 フィールドと フィールドを設定できます。以前のバージョンのドライバーを使用している場合は、オプション ビルダー メソッドをbuilder()メソッドに連結して、 FindOptionsまたはFindOneOptionsインスタンスを構築する必要があります。 次に、オプション インスタンスをパラメーターとしてfind()またはfind_one()に渡します。

各タイプに指定できる設定の完全なリストについては、 FindOptions および FindOneOptions のAPIドキュメントを参照してください。

次のセクションには、 find()メソッドとfind_one()メソッドを使用してフィルター条件に一致するサンプル ドキュメントを取得する例が含まれています。

この例では、次のアクションを実行します。

  • find()メソッドを呼び出します

  • find()の値がunit_price 12.00未満で、かつ でないドキュメントに一致するクエリフィルターを に渡しますcategory"kitchen"

  • sort()メソッドをfind()に連鎖させ、一致したドキュメントをunit_priceで降順に並べ替えます

let mut cursor = my_coll
.find(doc! { "$and": vec!
[
doc! { "unit_price": doc! { "$lt": 12.00 } },
doc! { "category": doc! { "$ne": "kitchen" } }
] })
.sort(doc! { "unit_price": -1 })
.await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Inventory { item: "watering can", category: "garden", unit_price: 11.99 }
Inventory { item: "candle", category: "decor", unit_price: 2.89 }

この例では、 sample_restaurantsデータベース内のrestaurantsコレクションからクエリフィルターに一致するドキュメントを検索します。 find() メソッドは、cuisineフィールドの値が "French" であるすべてのドキュメントを返します。

取得された各ドキュメントは、 Document タイプまたはカスタムデータ型としてモデル化できます。 コレクションのデータを表すデータ型を指定するには、強調表示された行の <T> 型パラメータを次のいずれかの値に置き換えます。

  • <Document>:コレクションドキュメントをBSONドキュメントとして検索して出力します

  • <Restaurant>: コードの上部で定義された Restaurant 構造体のインスタンスとしてコレクションドキュメントを検索して出力します

各実行時に対応するコードを表示するには、 AsynchronousタブまたはSynchronousタブを選択します。

use mongodb::{
bson::doc,
Client,
Collection
};
use futures::TryStreamExt;
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let mut cursor = my_coll.find(
doc! { "cuisine": "French" }
).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:#?}", doc);
}
Ok(())
}
use mongodb::{
bson::doc,
sync::{Client, Collection}
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let mut cursor = my_coll.find(
doc! { "cuisine": "French" }
).run()?;
for result in cursor {
println!("{:#?}", result?);
}
Ok(())
}

コレクションの型パラメータに基づいて対応するコード出力を表示するには、[BSON Document Results タブまたは Restaurant Struct Resultsタブを選択します。

...
Some(
Document({
"_id": ObjectId(
"...",
),
...
"name": String(
"Cafe Un Deux Trois",
),
...
}),
),
Some(
Document({
"_id": ObjectId(
"...",
),
...
"name": String(
"Calliope",
),
...
}),
)
...
...
Restaurant {
name: "Cafe Un Deux Trois",
cuisine: "French",
}
Restaurant {
name: "Calliope",
cuisine: "French",
}
...

クエリフィルターをJSONファイルに保存し、実行時に読み込むことができます。このアプローチにより、 RustアプリケーションとMongoDB Shell(mongosh)などの外部ツールとの間でクエリ定義を共有できます。

Tip

サーバーJSON依存関係

ファイルからクエリを読み込む前に、プロジェクトルートから次のコマンドを実行中て serde_json 依存関係を追加します。

cargo add serde_json

まず、クエリフィルターを含むJSONファイルを作成します。次のサンプルquery.jsonファイルには、categoryフィールド値が "kitchen" であるドキュメントに一致する比較クエリフィルターが含まれています。

query.json
{ "category": "kitchen" }

このファイルをRustアプリケーションにロードするには、std::fs::read_to_string() メソッドを使用してファイルを読み取ります。次に、serde_json::from_str() を呼び出してJSON string を Documentインスタンスに解析します。Documentserde::Deserialize 機能を実装しているため、 JSON string から直接逆直列化できます。

次の例では、 query.jsonファイルからクエリフィルターを読み取り、それを find() メソッドに渡します。

let json = std::fs::read_to_string("query.json")
.expect("failed to read query.json");
let filter: Document = serde_json::from_str(&json)
.expect("query.json contains invalid JSON");
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Inventory { item: "blender", category: "kitchen", unit_price: 38.49 }
Inventory { item: "placemat", category: "kitchen", unit_price: 3.19 }

この例では、次のアクションを実行します。

  • find_one()メソッドを呼び出します

  • unit_priceの値が20.00以下のドキュメントに一致するクエリフィルターをfind_one()に渡します

  • 最初に一致したドキュメントをスキップするには、 skip()メソッドをfind_one()にチェーンします。

let result = my_coll
.find_one(doc! { "unit_price": doc! { "$lte": 20.00 } })
.skip(2)
.await?;
println!("{:#?}", result);
Some(
Inventory {
item: "watering can",
category: "garden",
unit_price: 11.99,
},
)

この例では、 sample_restaurantsデータベース内の restaurantsコレクションからクエリフィルターに一致するドキュメントを検索します。 find_one() メソッドは、nameフィールドの値が "Tompkins Square Bagels" である最初のドキュメントを返します。

取得されたドキュメントは、 Document 型またはカスタムデータ型としてモデル化できます。 コレクションのデータを表すデータ型を指定するには、強調表示された行の <T> 型パラメータを次のいずれかの値に置き換えます。

  • <Document>:コレクションドキュメントをBSONドキュメントとして検索して出力します

  • <Restaurant>: コードの上部で定義された Restaurant 構造体のインスタンスとしてコレクションドキュメントを検索して出力します

各実行時に対応するコードを表示するには、 AsynchronousタブまたはSynchronousタブを選択します。

use mongodb::{
bson::doc,
Client,
Collection
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri).await?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let result = my_coll.find_one(
doc! { "name": "Tompkins Square Bagels" }
).await?;
println!("{:#?}", result);
Ok(())
}
use mongodb::{
bson::doc,
sync::{Client, Collection}
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: String,
}
fn main() -> mongodb::error::Result<()> {
let uri = "<connection string>";
let client = Client::with_uri_str(uri)?;
// Replace <T> with the <Document> or <Restaurant> type parameter
let my_coll: Collection<T> = client
.database("sample_restaurants")
.collection("restaurants");
let result = my_coll.find_one(
doc! { "name": "Tompkins Square Bagels" }
).run()?;
println!("{:#?}", result);
Ok(())
}

コレクションの型パラメータに基づいて対応するコード出力を表示するには、[BSON Document Result タブまたは Restaurant Struct Resultタブを選択します。

Some(
Document({
"_id": ObjectId(
"...",
),
...
"name": String(
"Tompkins Square Bagels",
),
...
}),
)
Some(
Restaurant {
name: "Tompkins Square Bagels",
cuisine: "American",
},
)

集計操作 を使用して、コレクションからデータを取得して変換します。 aggregate()メソッドを使用して集計操作を実行できます。

aggregate()メソッドは、集計パイプラインをパラメーターとして受け取ります。 集計パイプラインには、データの変換方法を指定する 1 つ以上のステージが含まれます。 ステージには、集計演算子(プレフィックスとして$ )と、その演算子に必要なパラメータが含まれます。

集計の詳細と集計の例については、集計ガイドを参照してください。

このメソッドでは、 Cursorタイプの結果ドキュメントが返されます。 集計パイプラインに$matchステージが含まれていない場合、パイプラインはコレクション内のすべてのドキュメントを処理します。

AggregateOptionsオプション ビルダー メソッドをaggregate()に連鎖させることで、 aggregate()メソッドの動作を変更できます。

次の表では、対応するビルダ メソッドを呼び出して設定できる一般的に使用されるAggregateOptionsフィールドについて説明しています。

フィールド
説明

allow_disk_use

一時ファイルへの書き込みを有効にします。trueの場合、集計ステージはdbPathディレクトリ内の_tmpサブディレクトリにデータを書き込むことができます。

タイプ: bool
デフォルト: false

batch_size

カーソルバッチごとにサーバーが返すドキュメントの最大数を指定します。このオプションは、カーソルが返すドキュメントの数ではなく、カーソルがメモリに保持するドキュメントの数を設定します。

タイプ: u32
デフォルト: 初期は 101 ドキュメント、以降のバッチは最大 16 MB ドキュメント

collation

結果をソートするときに使用する照合。照合について詳しくは、「照合」ガイドを参照してください。

タイプ: Collation
デフォルト: None

hint

操作に使用するインデックス。インデックスの詳細については、サーバー マニュアルの「インデックス」を参照してください。

タイプ: Hint
デフォルト: None

read_concern

検索操作に使用する読み取り保証 (read concern)。このオプションを設定しない場合、操作はコレクションに設定された読み取り保証 (read concern)を継承します。読み取り保証 (read concern) の詳細については、サーバーマニュアルの「読み取り保証 (read concern)」を参照してください。

タイプ: ReadConcern

write_concern

操作の書込み保証 (write concern)。このオプションを設定しない場合、操作はコレクションに設定された書込み保証 (write concern)を継承します。書込み保証 (write concern) の詳細については、サーバー マニュアルの「書込み保証(write concern) 」を参照してください。

タイプ: WriteConcern

設定の完全なリストについては、AggregateOptions のAPIドキュメントを参照してください。

この例では、次のステージを含むパイプラインでaggregate()メソッドを呼び出す方法を示しています。

  • $group ステージ: categoryフィールドの各値について unit_priceフィールドの平均を計算

  • $sort ステージ: 結果を avg_price で昇順に並べ替える

let pipeline = vec![
doc! { "$group": doc! { "_id" : doc! {"category": "$category"} ,
"avg_price" : doc! { "$avg" : "$unit_price" } } },
doc! { "$sort": { "_id.avg_price" : 1 } },
];
let mut cursor = my_coll.aggregate(pipeline).await?;
while let Some(result) = cursor.try_next().await? {
println!("{:?}", result);
}
Document({"_id": Document({"category": String("decor")}), "avg_price": Double(2.890000104904175)})
Document({"_id": Document({"category": String("kitchen")}), "avg_price": Double(20.840000867843628)})
Document({"_id": Document({"category": String("garden")}), "avg_price": Double(11.989999771118164)})

検索操作の実行可能な例については、次の使用例を参照してください。

このガイドの操作の詳細については、次のドキュメントを参照してください。

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