🔦

【Rust】MongoDBで配列内の特定の値だけnullに更新する実装

2024/05/21に公開

概要

MongoDBで配列内の値を更新するクエリはMongoDBで配列内の特定の値だけを更新するの記事で紹介されています。
今回はこの記事を参考にして、Rustで配列内の特定の値だけnullに更新する実装をしてみたのでメモ書きします。

前提

  • 今回使用したrustcのバージョンは1.78.0、mongo-rust-driverのバージョンは2.8.2です。

実装のポイント

  • nullをどうやって設定するかという点について、bsonのドキュメントにあるNullのenumを使用します。
  • array_filtersに設定する実装として、UpdateOptionsを使用します。updateのクエリの際にこちらのoptionを設定します。

実装サンプル

サンプルとして、memo_listという配列の特定のcategory_idだけnullにする実装は以下になります。

pub async fn detach_race_memo_category(
    db: Database,
    account_user_id: String,
    to_null_category_id: String,
) -> Result<UpdateResult, Error> {
    let collection = db.collection::<db_model::SampleInfo>(db_model::SAMPLE_INFO_COLLECTION);
    // ドキュメントのフィルター
    let filter_doc = doc! { "$and": [
        doc! { "account_user_id": account_user_id.clone()},
    ]};
    // nullに更新する
    let set_doc = doc! {
        "$set": doc! { "memo_list.$[element].category_id": Bson::Null }
    };
    // オプションに配列のフィルターをセット
    let update_options = UpdateOptions::builder()
        .array_filters(vec![doc! { "element.category_id": to_null_category_id.clone() }])
        .build();

    return collection
        .update_many(filter_doc, set_doc, update_options)
        .await;
}

Discussion