当前位置: 首页 > 面试题库 >

在查询时通过猫鼬降低内存使用量的方法

章琛
2023-03-14
问题内容

我正在节点后端上尝试通过mongoose优化对mongodb的非常繁重的查询。预期的返回大小是相当大的,但是由于某种原因,当我发出请求时,节点开始消耗大量内存,例如单个大请求的内存为200mb
+。

考虑到返回的大小在大多数情况下小于10mb,这似乎是不对的。它也拒绝在完成后释放内存,我知道这可能只是V8
GC在执行其默认行为,但是让我担心的是,单个find()请求占用了大量内存。

我已通过测试到find()调用将其隔离。调用完成后,它会执行一些后处理,然后将数据发送到回调,所有这些操作都在匿名函数中。我尝试使用querystream代替model.find(),但是它没有显示出任何实际的改进。

环顾四周并没有产生任何响应,所以我想问一下,有没有一种已知的方法来减少,控制或优化猫鼬的内存使用?有谁知道为什么一个电话要使用这么多的多余内存?

编辑

根据Johnny和Blakes的建议,将lean()与流混合使用,以及使用暂停和恢复功能极大地改善了运行时和内存使用率。谢谢!


问题答案:

您可以使用lean选项进行Mongoose查询,只要您只需要纯JavaScript文档而不需要完整的Mongoose文档实例即可。这样可以提高性能并减少内存使用。

model.find().lean().exec(function(err, docs) {...});

您还可以将lean()结果与流式传输相结合,这将进一步减少内存使用量。

var stream = model.find().lean().stream();


 类似资料:
  • 问题内容: 一般而言,我对Mongoose和MongoDB还是很陌生,所以我很难确定是否可以进行以下操作: 有更好的方法吗? 编辑 如有任何混淆,我们深表歉意。我想做的是获取所有包含有趣标签或政治标签的商品。 编辑 没有where子句的文档: 使用where子句,我得到一个空数组。 问题答案: 对于大于3.2的现代MongoDB,您可以在大多数情况下用作替代。这也有实际上做加盟,而不是什么“在服务

  • 问题内容: 我对该方法的使用感到很困惑。这是我的用法,这是错误的: 我想要实现的只是从数据库中的事务中选择具有该用户名的事务,而我只想取出方法中列出的字段。谁能指出我该如何使用该方法?谢谢。 问题答案: 该文件说,你可以像这样实现的: 猫鼬v4.0 旧的过时的API 因此,您无需执行此操作。

  • 问题内容: 我正在尝试使用Mongoose制作动态条件,但是它并没有像我想象的那样起作用。 代码是这样的 如您所见,我正在尝试使用“索引”变量创建动态条件。有可能这样做吗? 先感谢您! 问题答案: 您需要分两步创建对象: 更新资料 现在,node.js 4+支持计算的属性名称,您可以一步完成此操作:

  • 我正在尝试按id搜索对象,但出现以下错误:CastError:Cast to ObjectId在路径“\u id”处的值“[object object]”失败 这是我的代码: console.log(org_id.organisation_id); 给我:5661639AFF20A5CC806D476

  • 我刚刚被这个问题缠住了。我有两个猫鼬模式: 问题是,如何从每个父文档中获取所有子文档(在这种情况下,对象)?假设我有一些数据: 我想在一个查询中检索所有18岁以上的儿童。有可能吗?每一个回答都将不胜感激,谢谢!

  • 问题内容: 我试图查询该属性,该属性是对另一个架构的引用和一些其他数据的数组。为了更好的说明,以下是模式: 虽然我成功地查询了引用,即: 我在查询属性时遇到了一些问题,即这不起作用: 甚至有可能基于查询吗?如果是这样,最好的方法是什么? 谢谢! 更新: 问题是,结果要么是完整的数组,要么什么都不是(请参阅更新的问题)。我只想获取数量等于或大于5的那些记录。使用您的(和我的)方法,我要么根本没有任何