【发布时间】:2021-04-21 01:07:49
【问题描述】:
当我尝试使用 mongoose 将新数据添加到数组时出现两个错误。这是我的代码:
return await db.fileMeta.findOneAndUpdate({
username: username,
'files.fileUID': {
$ne: data.fileUID
}
}, {
$addToSet: {
files: data
}
}).exec();
data 是一个 JavaScript 对象,它有 25 个项目,总计 789 字节......没有接近 16MB 的空间。我的代码直到最近(最近几天)都运行良好,然后我开始收到此错误:
MongoError: BSONObj size: 16829075 (0x100CA93) is invalid. Size must be between 0 and 16793600(16MB) First element: $v: 1
at MessageStream.messageHandler (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/connection.js:268:20)
at MessageStream.emit (events.js:314:20)
at processIncomingData (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
at doWrite (_stream_writable.js:403:12)
at writeOrBuffer (_stream_writable.js:387:5)
at MessageStream.Writable.write (_stream_writable.js:318:11)
at TLSSocket.ondata (_stream_readable.js:719:22)
at TLSSocket.emit (events.js:314:20)
at addChunk (_stream_readable.js:298:12)
at readableAddChunk (_stream_readable.js:273:9)
at TLSSocket.Readable.push (_stream_readable.js:214:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:188:23) {
ok: 0,
code: 10334,
codeName: 'BSONObjectTooLarge'
}
然后上面的错误停止了,我得到了花药:
MongoError: Resulting document after update is larger than 16777216
at MessageStream.messageHandler (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/connection.js:268:20)
at MessageStream.emit (events.js:314:20)
at processIncomingData (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/message_stream.js:144:12)
at MessageStream._write (/home/user/projects/web-app/node_modules/mongoose/node_modules/mongodb/lib/cmap/message_stream.js:42:5)
at doWrite (_stream_writable.js:403:12)
at writeOrBuffer (_stream_writable.js:387:5)
at MessageStream.Writable.write (_stream_writable.js:318:11)
at TLSSocket.ondata (_stream_readable.js:719:22)
at TLSSocket.emit (events.js:314:20)
at addChunk (_stream_readable.js:298:12)
at readableAddChunk (_stream_readable.js:273:9)
at TLSSocket.Readable.push (_stream_readable.js:214:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:188:23) {
ok: 0,
code: 17419,
codeName: 'Location17419'
}
使用 MongoDB Compass 我可以看到:
注意16.2MB的总大小,这是我唯一能想到的,甚至会损失到16MB。
我会理解,如果错误试图说我的 data 对象太大,但由于它太小(789 字节),我不明白为什么我会收到错误或如何要解决这个问题。如果错误是因为整个 DB 大于 16MB,那么一定是有问题,因为显然 DB 应该扩展到大于 16MB。
我怎样才能防止这个错误?
【问题讨论】:
-
我认为您需要制作更多、更小的文档,而不是 1 个庞大的文档。
-
789字节数很大? -
您分享的屏幕截图显示您有 3 个文档,平均大小为 5.4MB。 addToSet 可能会在您每次调用时更新您的文档。
-
@Evert 啊,我明白了。每个文档代表一个用户,然后他们每个人都有一组文件元数据对象,我的
data正在推送到这些对象。切换到更扁平的结构需要大量重建,但如果您认为我现在拥有的 DB 结构是问题,我会试一试。 -
我不是 Mongo 专家,但是将所有内容都放在几个庞大的文档中感觉就像是错误的设计!
标签: javascript mongodb mongoose mongoose-schema