【问题标题】:Resulting document after update is larger than 16777216更新后生成的文档大于 16777216
【发布时间】: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


【解决方案1】:

我采纳了@Evert 的建议并扁平化了我的数据库,以便每个文件的元数据都是它自己的文档,而不是文档中的数组。现在它工作正常。

const fileMetadataDocument = new db.FileMetadata(data);

const saved = await fileMetadataDocument.save();
//Works

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2014-12-18
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多