Mongodb 解决Mongoose和GraphQL中的关系
所以,我有一个我正在启动的应用程序,我将使用Apollo使用MERNG stack 我通过阅读博客文章和观看视频来进行研究,以便更好地了解GraphQL是如何工作的,但实际上从未使用过它。在某个时候,我开始看到db模型之间关系的示例,例如来自用户的帖子 例如:Mongodb 解决Mongoose和GraphQL中的关系,mongodb,mongoose,graphql,apollo-server,Mongodb,Mongoose,Graphql,Apollo Server,所以,我有一个我正在启动的应用程序,我将使用Apollo使用MERNG stack 我通过阅读博客文章和观看视频来进行研究,以便更好地了解GraphQL是如何工作的,但实际上从未使用过它。在某个时候,我开始看到db模型之间关系的示例,例如来自用户的帖子 例如: import { model, Schema } from 'mongoose'; const postSchema = new Schema( { title: String, cr
import { model, Schema } from 'mongoose';
const postSchema = new Schema(
{
title: String,
createdBy {
type: Schema.Types.ObjectId,
ref: 'User',
}
};
export default model('Post', postSchema);
我想知道在进行查询以检索帖子中的用户数据时,哪种方法是填充相关字段的最佳方法
正如我看到的,有两种选择:
1-使用猫鼬附带的填充。这样做的缺点是,即使我没有在GraphQL查询中请求字段,它也将始终填充该字段。
2-使用一个函数,该函数将使用findById检索相关对象,然后手动分配它。这不存在填充的问题,因为它只在需要字段时才会得到它,相反,它增加了我必须查询数据库的次数
我了解利弊,但我不确定哪一个是最好的解决方案。还有其他我没有的选项吗?您的第二个选项对数据库不好,因为如果您从数据库中获得数百万条记录,那么当您调用特定字段时,另一个数百万条点击会自动工作 你的第一个选择也不符合你的期望。因为您是否需要特定的字段,它会自动调用 所以我希望这对你来说是更好的解决方案。您可以从客户端获取字段要求的内容,您可以使用自定义装饰器来获取这些字段。然后,您应该使用聚合来获取所需的内容。然后根据字段just use if条件决定是否调用$lookup 注意:Resolve属性不应命中数据库,因为原因是您已经知道 我希望它能帮助你
import { model, Schema } from 'mongoose';
const userSchema = new Schema(
{
email: String,
password: String,
posts [{
type: Schema.Types.ObjectId,
ref: 'Post',
}]
}
export default model('User', userSchema);