🧮
【Rust】mongo-rust-driverのクエリで動的にfilterのdocの内容を変えたい
概要
MongoDBでfindなどのクエリを発行するときに、サーバーサイドでfilterを条件に応じて変更して投げたいという場合があると思います。
mongo-rust-driverを使用した時に、どう実装するかというのを今回メモ書きします。
対応案
githubのissueHow can I add document fields conditional?で対応案が紹介されています。docのmerge
とinsert
を使う方法が紹介されていますが、今回はinsertを使う方法で試しに実装してみました。
前提
- 今回使用したrustcのバージョンは
1.77.0
、mongo-rust-driverのバージョンは2.8.1
です。
実装サンプル
以下の実装サンプルでは、keyowrdが入力として設定されていればfilterに追加、なければ追加せずにクエリを投げます。
pub async fn sample_filter(db: Database, keyowrd_opt: Option<String>) -> Cursor<SampleInfo> {
// テスト用に設定したmodel
let collection = db.collection::<db_model::SampleInfo>(db_model::SAMPLE_INFO_COLLECTION);
// フィルター
let mut filter_doc = doc! {};
// キーワードが与えられてたらfilterに追加する
if let Some(keyword) = keyowrd_opt {
filter_doc.insert("keyword", doc! { "$regex": keyword, "$options": "i"});
};
let result = collection.find(filter_doc, None).await;
return result.unwrap();
}
Discussion