在Apollo GraphQL解析器中使用的父级参数与MongoDB聚合中的$lookup阶段用于连接Mongoose模型的比较
<p>我正在使用 Apollo GraphQL 和 Mongoose 开发后端应用程序。我有两个模型:User 和 Post,它们具有一对多关系(一个用户可以有多个帖子,但一个帖子属于一个用户)。</p>
<p>我想查询 GraphQL 架构中的用户字段,以按用户 ID 获取用户以及属于该用户的所有帖子。我还想查询我的帖子类型中的作者字段以获取撰写该帖子的用户。</p>
<p>我了解到,有两种方法可以连接 MongoDB 中不同集合的数据:使用 Apollo GraphQL 解析器中的父参数,或使用 MongoDB 聚合中的 $lookup 阶段。</p>
<p>父参数是一个对象,其中包含从父字段上的解析器返回的结果。父参数可用于访问父字段或类型中的数据,并将其传递给子字段或类型。例如,我可以使用它来加入猫鼬模型,如下所示:</p>
<pre class="brush:php;toolbar:false;">type User {
id: ID!
name: String
posts: [Post]
}
type Post {
id: ID!
title: String
author: User
}
type Query {
user(id: ID!): User
}
const resolvers = {
User: {
posts(parent, args, context) {
return context.db.Post.find({ author: parent.id });
},
},
};</pre>
<p>$lookup 阶段是一个聚合管道阶段,它对同一数据库中的另一个集合执行左外连接。 $lookup 阶段可用于将多个集合中的数据合并到单个结果集中。例如,我可以使用它来加入这样的模型:</p>
<pre class="brush:php;toolbar:false;">db.posts
.aggregate([
{
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
as: "author",
},
},
])
.toArray((err, posts) => {
console.log(posts);
});</pre>
<p>我不确定我的应用程序应使用哪一个。我想选择更高效、可扩展和可维护的选项。</p>
<p>在 Apollo GraphQL 解析器中使用父参数和在 MongoDB 聚合中使用 $lookup 阶段来加入 Mongoose 模型之间的主要区别和权衡是什么?</p>