我正在将数据从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是不是在编译时考虑?有什么想法如何解决?
1条答案
按热度按时间5vf7fwbs1#
我问了同样的问题in Rust reddit和in 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。