MongoDB Rust:类型化集合的投影|这个怎么做?

Posted

技术标签:

【中文标题】MongoDB Rust:类型化集合的投影|这个怎么做?【英文标题】:MongoDB Rust: Projections with typed collections | How to do this? 【发布时间】:2022-01-14 14:40:08 【问题描述】:

我对 Rust 很陌生,只是在使用 MongoDB 编写 GraphQL API 时尝试学习它。目前,我正在努力将文档解码到我的 CourseDocument 结构中。

#[derive(Serialize, Deserialize, Debug, Eq)]
struct CourseDocument 
    #[serde(rename = "_id")]
    id: ObjectId,
    #[serde(rename = "localizedFields")]
    localized_fields: Vec<CourseDocumentLocalizedFields>,
    categories: Vec<ObjectId>,
    tags: Vec<ObjectId>,
    trainers: Vec<ObjectId>,
    videos: Vec<ObjectId>,


impl PartialEq for CourseDocument 
    fn eq(&self, other: &Self) -> bool 
        self.id == other.id
    

在我的main() 函数中,我尝试了以下操作

let course_collection = database.collection::<CourseDocument>("courses");

let projection = doc! "localizedFields": 1;

let options = FindOptions::builder()
    .limit(10)
    .projection(projection)
    .build();

let mut cursor = course_collection.find(None, options).await.unwrap();

while let Some(course) = cursor.try_next().await.unwrap() 
    println!(":#?", course)

此代码引发以下错误: Error kind: InvalidResponse message: "missing field 'categories'" , labels:

该错误确实有意义,因为CourseDocument 要求categories 字段至少是一个空向量。但我仍然想知道正确的struct 声明是什么。

我是否必须用 Option 枚举来包装每个字段才能使投影和键入的文档成为可能?

【问题讨论】:

【参考方案1】:

您可以使用clone_with_type() 来创建具有相同来源但类型不同的Collection。使用它,您可以反序列化为仅具有那些投影字段的类型。

#[derive(Serialize, Deserialize)]
struct ProjectedCourseDocument 
    #[serde(rename = "localizedFields")]
    localized_fields: Vec<CourseDocumentLocalizedFields>,

let mut cursor = course_collection
    .clone_with_type::<ProjectedCourseDocument>()
    .find(None, options)
    .await
    .unwrap();

【讨论】:

我是否必须为每个可能的投影都这样做,还是有更好的方法来处理这个?我到处搜索,但还没有找到好的解决方案。 如果您希望结果的类型正确,我没有更好的建议。您是否仅预测 GraphQL 查询的字段?您可以按照最初的建议进行操作,并将所有字段设为可选。 感谢您的帮助!我认为会有一个很好的方法来实现这一点。

以上是关于MongoDB Rust:类型化集合的投影|这个怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 索引和投影

文档上缺少字段的 MongoDB 投影

使用Spring-Integration获取具有某些字段(投影)的mongodb文档(仅限注释)

MongoDB 投影性能 - 还是只是许多小文档?

MongoDB操作

Mongodb 找到不支持的投影选项