Vergleich der im Apollo GraphQL-Resolver verwendeten übergeordneten Parameter mit der $lookup-Phase in der MongoDB-Aggregation zum Verbinden von Mongoose-Modellen
P粉543344381
2023-09-02 09:22:26
<p>Ich entwickle eine Backend-Anwendung mit Apollo GraphQL und Mongoose. Ich habe zwei Modelle: Benutzer und Beitrag, die eine Eins-zu-Viele-Beziehung haben (ein Benutzer kann mehrere Beiträge haben, aber ein Beitrag gehört einem Benutzer). </p>
<p>Ich möchte das Feld „Benutzer“ in einem GraphQL-Schema abfragen, um einen Benutzer anhand der Benutzer-ID und aller zu diesem Benutzer gehörenden Beiträge zu erhalten. Ich möchte auch das Feld „Autor“ in meinem Beitragstyp abfragen, um den Benutzer zu ermitteln, der den Beitrag geschrieben hat. </p>
<p>Ich habe erfahren, dass es zwei Möglichkeiten gibt, Daten aus verschiedenen Sammlungen in MongoDB zusammenzuführen: die Verwendung des übergeordneten Parameters im Apollo GraphQL-Resolver oder die Verwendung der $lookup-Stufe in einem MongoDB-Aggregat. </p>
<p>Der übergeordnete Parameter ist ein Objekt, das die vom Parser für das übergeordnete Feld zurückgegebenen Ergebnisse enthält. Übergeordnete Parameter können verwendet werden, um auf Daten aus einem übergeordneten Feld oder Typ zuzugreifen und diese an ein untergeordnetes Feld oder einen untergeordneten Typ zu übergeben. Ich kann es zum Beispiel verwenden, um einem Mungo-Modell wie diesem beizutreten: </p>
<pre class="brush:php;toolbar:false;">type User {
Ich tat!
Name: Zeichenfolge
Beiträge: [Beitrag]
}
Typ Beitrag {
Ich tat!
Titel: String
Autor: Benutzer
}
Typ Abfrage {
user(id: ID!): Benutzer
}
const Resolver = {
Benutzer: {
Beiträge(Parent, Argumente, Kontext) {
return context.db.Post.find({ author: parent.id });
},
},
};</pre>
<p>Die $lookup-Stufe ist eine Aggregationspipeline-Stufe, die einen linken äußeren Join mit einer anderen Sammlung in derselben Datenbank durchführt. Die Phase „$lookup“ kann verwendet werden, um Daten aus mehreren Sammlungen in einem einzigen Ergebnissatz zusammenzuführen. Ich kann es zum Beispiel verwenden, um einem Modell wie diesem beizutreten: </p>
<pre class="brush:php;toolbar:false;">db.posts
.Aggregat([
{
$lookup: {
von: "Benutzer",
localField: "Autor",
ForeignField: "_id",
als: "Autor",
},
},
])
.toArray((err, posts) => {
console.log(Beiträge);
});</pre>
<p>Ich bin mir nicht sicher, welches ich für meine Bewerbung verwenden soll. Ich wollte eine effizientere, skalierbarere und wartbarere Option wählen. </p>
<p>Was sind die Hauptunterschiede und Kompromisse zwischen der Verwendung übergeordneter Parameter in Apollo GraphQL-Resolvern und der Verwendung der $lookup-Stufe in MongoDB-Aggregationen zur Verknüpfung von Mongoose-Modellen? </p>
我推荐第一种技术 - 它肯定更干净并且可能更快。您应该确保为
author
字段建立索引 - 就像在 RDB 中为外键建立索引一样。这两种方法之间确实存在一些差异
使用解析器
我发现这种方法更直观、更具可读性,因此更易于维护,尤其是对于复杂的查询
但是,在处理大量数据时,它可能不是最有效的,因为它会为每个嵌套字段对数据库进行额外的调用。在处理大量复杂的嵌套查询时,这可能会成为性能瓶颈。
使用$lookup
另一方面,$lookup 操作通常性能更高,因为它们使用单个数据库调用来连接和检索数据。
但是,随着查询复杂性的增加,$lookup 操作可能会变得复杂且难以阅读和维护。它可能需要更多关于 MongoDB 查询语言的知识,并且可能不像解析器方法那样简单易用。写得不好的聚合可能会导致性能问题,所以要绝对确定你在做什么。
因此,在您的示例中,我不介意使用解析器方法,即使使用聚合速度更快,第一种方法也会更容易阅读/改进/维护。
希望有帮助:)