热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GraphQLDataloadervs猫鼬填充

如何解决《GraphQLDataloadervs猫鼬填充》经验,为你挑选了1个好方法。

为了执行类似连接的操作,我们可以同时使用GraphQL和Mongoose来实现这一目的。

在问任何问题之前,我想举一个下面的“任务/活动”示例(此代码没有经过测试,仅出于示例的目的而给出):

Task {
  _id,
  title,
  description,
  activities: [{ //Of Activity Type
    _id,
    title
  }]
}

在猫鼬中,我们可以使用populate方法检索与任务相关的活动,如下所示:

const task = await TaskModel.findbyId(taskId).populate('activities');

使用GraphQL和Dataloader,我们可以得到类似以下结果:

const DataLoader = require('dataloader');
const getActivitiesByTask = (taskId) => await ActivityModel.find({task: taskId});
const dataloaders = () => ({
    activitiesByTask: new DataLoader(getActivitiesByTask),
});
// ...
// SET The dataloader in the context
// ...

//------------------------------------------
// In another file
const resolvers = {
    Query: {
        Task: (_, { id }) => await TaskModel.findbyId(id),
    },
    Task: {
        activities: (task, _, context) => context.dataloaders.activitiesByTask.load(task._id),
    },
};

我试图查看是否有文章说明哪种方法在性能,资源枯竭等方面更好,但是我找不到这两种方法的比较。

任何见解都会有所帮助,谢谢!



1> Daniel Reard..:

重要的是要注意,数据加载器不仅是数据模型的接口。尽管数据加载器被吹捧为“基于各种远程数据源的简化且一致的API”,但与GraphQL结合使用时,它们的主要优势在于能够在单个请求的上下文中实现缓存和批处理。此类功能在处理潜在冗余数据的API中很重要(请考虑一下查询用户和每个用户的朋友-多次重访同一用户的可能性很大)。

另一方面,猫鼬的populate方法实际上只是聚合多个MongoDB请求的一种方式。从这个意义上讲,比较两者就像比较苹果和橘子。

可以按照populate问题中的说明进行更公平的比较,而不是按照以下方式添加解析器activities

activities: (task, _, context) => Activity.find().where('id').in(task.activities)

无论哪种方式,问题都取决于您是否将所有数据加载到父解析器中,还是让更深层次的解析器完成一些工作。因为仅针对请求中包含的字段调用解析器,所以这两种方法之间的性能可能会受到重大影响。

如果activities请求该字段,则这两种方法将使服务器和数据库之间的往返次数相同-性能差异可能很小。但是,您的请求可能根本不包含该activities字段。在这种情况下,activities将永远不会调用解析器,并且我们可以通过创建一个单独的activities解析器并在那里进行工作来保存一个或多个数据库请求。

在相关说明中...

据我了解,使用类似的$lookup方法在MongoDB中聚合查询通常比仅使用性能要差populate一些(关于此点的一些对话可以在此处找到)。但是,在关系数据库的上下文中,在考虑上述方法时还需要考虑一些其他因素。那是因为您可以使用联接完成在父解析器中的初始访存,这通常比发出单独的数据库请求要快得多。这意味着要以使“非活动性”字段查询变慢为代价,可以使其他查询变快得多。


推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • step1.为mongodb添加admin管理员root@12.154.29.163:~#mongoMongoDBshellversionv3.4.2connectingto:mo ... [详细]
  • 【Mysql】九、Mysql高级篇 索引
    MYSQL索引一、什么是索引?二、索引数据结构1、mysql数据库的四种索引2、BTREE结构三、索引分类、创建索引、查看索引1、单值索引2、复合索引3、函数索引4、 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
  • 前言:原本纠结于Web 模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中eval函数。虽然eval函 ... [详细]
  • <ItemTemplate><ahref#onclickjavascript:window.location.hrefoa_NoReply.aspx?fid ... [详细]
author-avatar
SuperBaby蜜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有