我正在嘗試創建一個方法,我可以向該方法傳遞一個 mongodb 連接池、一個 objectId 和集合名稱來檢索資料。
我想出了下面的代碼,但由于以下錯誤而無法編譯:
錯誤:該方法
find_one存在于 structmongodb::Collection<T>,但其特征邊界不滿足標簽:mongodb::Collection<T>由于未滿足特征邊界而無法呼叫方法注意:不滿足以下特征邊界:T: DeserializeOwnedT: UnpinT: std::marker::SendT: Sync標簽:mongodb::Collection<T>由于未滿足特征邊界而無法呼叫方法
我做錯了什么?
pub async fn generic_find_by_id<T>(db: &AppContext, object_id: String, collection_name: &str) -> Option<T> {
let collection = db.mongodb_pool.collection::<T>(collection_name);
let id_obj = ObjectId::parse_str(object_id);
let found = match id_obj {
Ok(id) => {
let filter = doc! {"_id": id};
let result = collection.find_one(filter, None).await;
match result {
Ok(result) => {
match result {
Some(result) => {
return Some(result);
}
None => {
return None;
}
}
}
Err(_) => {
return None;
}
}
}
Err(_) => {
return None;
}
};
}
uj5u.com熱心網友回復:
似乎Collection<T>::find_one()只有在T: DeserializeOwned Unpin Send Sync. (請參閱此處的源代碼:https : //docs.rs/mongodb/latest/src/mongodb/coll/mod.rs.html#795)。我認為Send并且Sync與在異步函式呼叫期間可能跨執行緒發送的集合有關。為了解決這個問題,你可以讓你的T型別實作Unpin和DeserializeOwned。(T自動實作SendandSync如果所有T的成員都是Sendand Sync。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/400717.html
上一篇:過濾MongoDB中的子檔案
