mongodb - mongodb投影后返回类型的类型
问题描述
我正在 rust 中制作一个 graphql 解析器,并且只从我的 mongodb 数据库中的 graphql 查询中获取字段。然而,Rust 抱怨说,当然,获取的数据现在与指定的返回类型不属于同一类型。做这样的事情的正确方法是什么。
我想我可以做到#[serde(default)]
,但这并不完全符合预期(我稍后会解释)
use async_graphql::*;
use serde::{Deserialize, Serialize};
use mongodb::{bson::doc, bson::oid::ObjectId, options::FindOptions, Collection};
#[derive(SimpleObject, Serialize, Deserialize, Debug)]
#[graphql(complex)]
struct Post {
#[serde(rename = "_id")]
pub id: ObjectId,
pub title: String,
// I could do something like
// #[serde(default)]
pub body: String,
}
#[ComplexObject]
impl Post {
async fn text_snippet(&self) -> &str {
let length = self.body.len();
let end = min(length, 5);
&self.body[0..end]
}
}
struct Query;
#[Object]
impl Query {
// fetching posts
async fn posts<'ctx>(&self, ctx: &Context<'ctx>) -> Vec<Post> {
let posts = ctx.data_unchecked::<Collection<Post>>();
let projection = // getting the projection doc here based on graphql fields, lets say doc! {"title": 1}
let options = FindOptions::builder().limit(10).projection(projection).build();
let cursor = posts.find(None, options).await.unwrap();
cursor.try_collect().await.unwrap_or_else(|_| vec![])
}
}
但是当我运行查询时
{
posts {
id
title
textSnippet
}
}
我明白了
thread 'actix-rt:worker:0' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: BsonDecode(DeserializationError { message: "missing field `body`" }), labels: [] }', server/src/schema/post.rs:20:46
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
当我#[serde(default)]
在正文上做这些事情,然后我查询 textSnippet 而不是正文时, textSnippet 是一个空字符串。
我该如何解决?
解决方案
你Post
能用一个包裹每个字段Option
并让try_collect
你填写返回的字段吗?
推荐阅读
- php - 如何使用 PHP 将正确的日期从 mdY 转换为 Ymd
- angular - 修剪字段值并在 onchange 事件 angular 中设置值
- debugging - 压力测试并发:如何减慢我的应用程序中的线程执行速度?
- javascript - SyntaxError:导入声明只能出现在带有 gulp 网页的模块的顶层
- c# - 服务总线重试逻辑:更喜欢队列重试还是实现 Polly?
- tkinter - tkinter:具有不同颜色的进度条
- c++ - 删除列表的一部分 C++
- ios - 将 Unicode 字符串显示为表情符号
- windows - 是否可以使用具有与管理员相同的浏览器数据的 RDP?
- c# - 如何在 UWP 中更改 AppBarButton 字体大小?