rust 由于未满足的特征边界,无法在mongodb::Cursor〈>上调用方法try_next

jv4diomz  于 2022-11-12  发布在  Go
关注(0)|答案(1)|浏览(117)

我正在将数据从mongodb加载到我的数据模型中,并且一切都运行良好,直到我将Vec字段添加到我的模型中(并且在Serde中标记为ignore)。
下面是我的模型:


# [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是不是在编译时考虑?有什么想法如何解决?

5vf7fwbs

5vf7fwbs1#

我问了同样的问题in Rust redditin MongoDB forum,所以两个地方提出的解决方案都是使用Arc而不是Rc
下面是MongoDB的Kaitlin Mahar的详细回答:
你好,Yuri_戈尔,这是一个与thread中描述的类似的问题。简而言之,如果T实现了DeserializeOwned、Unpin、Send和Sync,则Cursor类型仅实现Stream。因为Rc是!Send和!Sync,所以添加Rc使Cursor不再实现Stream。
为了解决这个问题,我们建议使用Arc而不是Rc,因为Arc实现了发送和同步。
与此相关的是,这在过去已经出现过,将来我们也许可以放宽这些特质的限制,以完全避免类似的错误;有关详细信息,请参见RUST-1358

相关问题