如何解决使用聚合或使用 nodejs 和 mongoose 手动过滤数据是否更快?
我正处于十字路口,试图决定使用哪种方法。基本上,我有一个 mongodb 集合,我想用用户提供的特定参数查询它,然后我想根据其中一些参数的值对响应进行分组。例如,假设我的收藏是动物,如果我查询所有动物,我会得到这样的结果
[
{type:"Dog",age:3,name:"Kahla"},{type:"Cat",age:6,name:"mimi"},...
]
现在我想向用户返回按动物类型分组的响应,以便我最终得到类似
{
Dogs: [...dog docs],Cats: [...cat docs],Cows: [...],}
所以基本上我有两种方法可以做到这一点。一种是仅使用 Model.find()
并获取与我的特定查询(例如年龄或任何其他字段)匹配的所有动物,然后手动过滤和格式化我的 json 响应,然后使用 {{1} 将其发送回用户}(顺便说一句,我用的是快递)
或者我可以使用 mongo 的聚合框架和 res.json({})
在查询级别执行此操作,因此从数据库返回对我的请求的已分组响应。到目前为止,我发现的唯一不便之处是响应的格式化方式,最终看起来更像这样
$group
总体结果基本相同,但响应的格式有很大不同,我的前端客户端需要调整以适应我发送响应的方式。我不太喜欢聚合中的对象数组,更喜欢类似 json 的对象响应,其中键名与我认为合适的数组对应。
所以这里真正的问题是,一种方式是否比另一种方式具有显着优势?聚合框架是否如此之快,以至于如果我的集合增长到巨大的数量,它会很好地扩展吗?是否使用 javascript 过滤数据并映射响应以便我可以根据自己的喜好调整它的形状,这是一个非常低效的过程,因此最好使用聚合并使前端适应此响应形状?
解决方法
我认为 Faster
是指处理请求的时间最短。也就是说,让我们划分处理您的请求所需的时间:
- 异步操作(网络操作、文件读/写等)
- 同步操作
同步操作通常比异步操作快得多。(这也取决于操作的性质和正在处理的数据量)。例如,如果您遍历长度小于 1000 的可迭代对象(例如数组、映射等),则不会超过几毫秒。
另一方面,异步操作需要更多的时间。例如,如果您运行 HTTP 请求,则需要几毫秒才能获得响应。
当你用 mongoose 查询 MongoDB 时,它是一个异步调用,需要更多的时间。因此,如果您对数据库运行更多查询,它会使您的 API 变慢。 MongoDB 聚合可以帮助您减少查询总数,这可能有助于您更快地制作 API。但问题是,聚合通常比普通的 find
请求慢。
总而言之,如果您可以在不添加任何数据库查询的情况下手动过滤数据,速度会更快。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。