我正在嘗試一次從我的 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' })它可以完美運行,但加載順序相反。
uj5u.com熱心網友回復:
語法本身很好,我不太確定為什么它不適合你。
我有兩個可能的理論:
- 您在 Atlas 上托管您的資料庫,并使用他們的檔案中指定的不合格實體進行此操作:
Atlas M0 免費集群和 M2/M5 共享集群不支持allowDiskUse
- 看來您使用的是貓鼬,也許您使用的是舊版本,該版本存在此游標標志或語法不同的問題。
無論問題的根源如何,我建議您通過以下任一方式解決此問題:
在 上創建索引
createdAt,索引存在時排序不會將檔案掃描到記憶體中,這樣既可以提高查詢效率,又可以解決這個問題。只需使用
_id索引和排序{ _id: -1},從您關于洗掉排序操作并以相反順序獲取檔案的評論中,您似乎createdAt對應的檔案創建日期(有意義),ObjectId_id是單調增加的,這意味著您可以使用該欄位來種類。
uj5u.com熱心網友回復:
我最終只是做了一個向后的for回圈,并使用skip而不是排序,比如
const getOne = asyncHandler(async (req, res) => {
const entry = await Entry.findOne({}, {}).allowDiskUse(true).skip(req.query.from)
res.status(200).json(entry)
})
這對我來說非常有效,但湯姆的答案正是我想要的,謝謝:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477504.html
標籤:javascript 数据库 mongodb 猫鼬 axios
上一篇:對于串列中的每個不同數字,計算數字后面的數字的平均值。(是的,很難理解)
下一篇:一個類中的多種型別
