node.js - 在 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个案例:
第一次取很慢
当我单击最后一页时,出现错误:
MongoError:排序超出了 104857600 字节的内存限制,但没有选择外部排序。中止操作。通过 allowDiskUse:true 选择加入。
请告诉我,我错误地构建了聚合,或者服务器上的内存是否存在问题,如错误所示并且需要额外的 nginx 设置(另一个人正在从事此操作),或者问题是否复杂,或者可能是其他原因共?
添加:
我注意到排序时没有使用索引,虽然应该使用它?
聚合执行console.log =>
[
{
"$match": {}
},
{
"$lookup": {
...
}
},
{
"$project": {
...,
createdAt: 1,
...
}
},
{
"$match": {}
},
{
"$sort": {
"createdAt": -1
}
},
{
"$skip": 0
},
{
"$limit": 10
}
]
感谢您的任何回答,对不起我的英语:)
解决方案
它确实说您有内存限制,这是有道理的,考虑到您正在尝试过滤 100,000 个请求。我会尝试使用return User.aggregate(query, { allowDiskUse: true }) //etc
,看看这是否有助于您的问题。
虽然这不是专门关于 Node.js 驱动程序的文档,但此链接总结了该allowDiskUse
选项的作用(或简而言之,它允许 MongoDB 超过 100MB 内存限制,并使用您的系统存储临时存储一些信息,同时执行查询)。
推荐阅读
- docker - 在同级容器中传递参数值
- c# - 在 .net 核心中创建“共享 zlib 上下文”
- javascript - 无法读取未定义的属性段
- google-apps-script - 如何将字段值传递给 Google 表单中的另一个字段
- c++ - 导入 Protobuf(Win64、CMake)时出现 RuntimeLibrary 不匹配错误
- html - 列数固定的列流?
- kotlin - Corda - CorDapp JAR 签名导致构建异常
- go-templates - 使用 {{if}} 过滤范围时如何抑制 Go 文本/模板输出中的换行符
- sql - 为什么这个用于导入 XML 文件的 SQL 服务器脚本挂起?
- algorithm - 比较 Kotlin 中的两个对象