首页 > 解决方案 > 在 Mongo 中查询时的速度问题和内存错误

问题描述

我有一个包含超过 100,000 条记录的表。服务器:node.js/express.js。DB:mongo 在客户端,实现了一个带有寻呼机的表。每次请求 10 条记录。

当然,当有 10,000 条记录时,一切都运行得更快,但现在不仅速度有问题。

我的聚合:

import { concat } from 'lodash';
...
let query = [{$match: {}}];
query = concat(query, [{$sort : {createdAt: -1}}]);
query = concat(query, [
    {$skip : (pageNum - 1) * perPage}, // 0
    {$limit : perPage}                 // 10
]);
return User.aggregate(query)
           .collation({locale: 'en', strength: 2})
           .then((users) => ...;

2个案例:

  1. 第一次取很慢

  2. 当我单击最后一页时,出现错误:

    MongoError:排序超出了 104857600 字节的内存限制,但没有选择外部排序。中止操作。通过 allowDiskUse:true 选择加入。

请告诉我,我错误地构建了聚合,或者服务器上的内存是否存在问题,如错误所示并且需要额外的 nginx 设置(另一个人正在从事此操作),或者问题是否复杂,或者可能是其他原因共?

添加:

我注意到排序时没有使用索引,虽然应该使用它?

在此处输入图像描述

聚合执行console.log =>

[
 {
      "$match": {}
 },
 {
      "$lookup": {
           ...
      }
 },
 {
      "$project": {
           ...,
           createdAt: 1,
           ...
      }
 },
 {
      "$match": {}
 },
 {
      "$sort": {
           "createdAt": -1
      }
 },
 {
      "$skip": 0
 },
 {
      "$limit": 10
 }
]

感谢您的任何回答,对不起我的英语:)

标签: node.jsmongodbnginxmongoose

解决方案


它确实说您有内存限制,这是有道理的,考虑到您正在尝试过滤 100,000 个请求。我会尝试使用return User.aggregate(query, { allowDiskUse: true }) //etc,看看这是否有助于您的问题。

虽然这不是专门关于 Node.js 驱动程序的文档,但此链接总结了该allowDiskUse选项的作用(或简而言之,它允许 MongoDB 超过 100MB 内存限制,并使用您的系统存储临时存储一些信息,同时执行查询)。


推荐阅读