我正在将数据从mongodb加载到我的数据模型中,一切都很好,直到我添加了Vec<Rc>字段添加到我的模型(并标记为Serde忽略(。
这是我的型号:
#[derive(Debug, Serialize, Deserialize)]
pub struct Relation {
#[serde(rename = "_id")]
pub id: oid::ObjectId,
// ....
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Item {
#[serde(rename = "_id")]
pub id: oid::ObjectId,
pub project_id: oid::ObjectId,
#[serde(skip)]
pub out_relations: Vec<Rc<Relation>>,
#[serde(skip)]
pub in_relations: Vec<Rc<Relation>>,
}
在这里,我正在阅读数据库中的项目:
//some db init code
let items = db.collection::<Item>("items");
let mut cursor = items.find(Some(doc! { "project_id": pid }), None).await?;
while let Some(item) = cursor.try_next().await? {
item_map.insert(item.id, item);
}
因此,一旦我切换到在向量中使用Rc(以前它只是ObjectId的向量,还可以(编译器开始抱怨:
try_next().await? {
^^^^^^^^ method cannot be called on `mongodb::Cursor<Item>` due to unsatisfied trait bounds
作为第二个错误(另请参阅(,它指向mongodb宏实现:
pub struct Cursor<T> {
| --------------------
| |
| doesn't satisfy `mongodb::Cursor<Item>: TryStreamExt`
| doesn't satisfy `mongodb::Cursor<Item>: TryStream`
这是不是像Rc没有实现流,并且在编译时不考虑忽略serde的这些字段?知道如何变通吗?
我在Rust-reddit和MongoDB论坛上问了同样的问题,所以在这两个地方提出的解决方案都是使用Arc而不是Rc-
以下是MongoDB的Kaitlin Mahar的详细回答:
你好@Yuri_Gor,这是一个与本文中描述的问题类似的问题线简而言之,Cursor类型仅在T实现DeserializeOwned、Unpin、Send和Sync。因为Rc是!发送和!同步,添加Rc使光标不再实现Stream。
为了解决这个问题,我们建议使用Arc而不是Rc,因为Arc实现了发送和同步。
与此相关的是,这种情况已经过去了,我们可能可以放松这些特征在未来的边界,以避免这样的错误;详见RUST-1358。