繁体   English   中英

Axios GET in for 循环导致“排序超出内存限制”错误

[英]Axios GET in for loop causing "Sort exceeded memory limit" error

我正在尝试一次从我的 mongoDB 数据库中加载一个条目。 它适用于大约 400/1000 个条目,然后出现以下错误:

Executor error during find command :: caused by :: Sort exceeded memory limit of 33554432 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.

我的 Axios 获取请求如下所示:

    for (let i = 0; i < total; i++) {
      await axios({
        method: "GET",
        url: "/api/entries/",
        params: { from: index + i, _limit: 1 },

      })
        .then((res) => {
          setPics((prev) => {
            return [...new Set([...prev, ...res.data])];
          });
          setIndex((prev) => prev++)
          setMoreEntries(res.data.length > 0)
        })

    }

在我的控制器中,我的 GET 函数如下所示:

const getEntries = asyncHandler(async (req, res) => {
  const entries = await Entry.find().allowDiskUse(true).sort({ createdAt: 'desc' }).skip(req.query.from).limit(req.query._limit)
  res.status(200).json(entries)
})

一切正常,直到加载了大约一半的条目,然后它就中断了。 我认为添加allowDiskUse(true)会修复它,但结果相同。

编辑:我应该提一下,如果我取出.sort({ createdAt: 'desc' })它工作得很好,但加载顺序相反。

语法本身很好,我不太确定为什么它不适合你。

我有两个可能的理论:

  1. 您在 Atlas 上托管您的数据库,并使用他们的文档中指定的不合格实例进行此操作:

Atlas M0 免费集群和 M2/M5 共享集群不支持allowDiskUse

  1. 看来您使用的是猫鼬,也许您使用的是旧版本,该版本存在此光标标志或语法不同的问题。

无论问题的根源如何,我建议您通过以下任一方式解决此问题:

  1. createdAt上创建索引,索引存在时排序不会将文档扫描到内存中,这样既可以提高查询效率,又可以解决这个问题。

  2. 只需使用_id索引并使用{ _id: -1}进行排序,从您关于删除排序操作并以相反顺序获取文档的评论中,您的createdAt似乎对应于文档创建日期(有意义),ObjectId _id是单调递增的这意味着您可以使用该字段进行排序。

我最终只是做了一个向后的for循环,并使用skip而不是排序,比如

const getOne = asyncHandler(async (req, res) => {
  const entry = await Entry.findOne({}, {}).allowDiskUse(true).skip(req.query.from)

  res.status(200).json(entry)
})

这对我来说非常有效,但汤姆的答案正是我想要的,谢谢:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM