🧮

【Rust】mongo-rust-driverのクエリで動的にfilterのdocの内容を変えたい

2024/03/24に公開

概要

MongoDBでfindなどのクエリを発行するときに、サーバーサイドでfilterを条件に応じて変更して投げたいという場合があると思います。
mongo-rust-driverを使用した時に、どう実装するかというのを今回メモ書きします。

対応案

githubのissueHow can I add document fields conditional?で対応案が紹介されています。docのmergeinsertを使う方法が紹介されていますが、今回は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