方法try_next不能在mongodb::Cursor上调用<>由于不满足的特征边界



我正在将数据从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。

最新更新