【问题标题】:"Document exceeds allowed max BSON size. The max is 16777216." error using GridFS“文档超出了允许的最大 BSON 大小。最大值为 16777216。”使用 GridFS 时出错
【发布时间】:2015-08-02 20:59:29
【问题描述】:

我正在尝试使用 GridFS 和 ruby​​ 在我的 mongo 数据库中插入一个 33 MB 的视频文件,并且我有一个系统的“文档超出允许的最大 BSON 大小。最大值为 16777216。”。 我认为在 mongo 集合中插入大于 16 MB 的文件的唯一方法是使用 Gridfs,所以我怀疑我做错了,即使我复制/粘贴了 Ruby 驱动程序示例 (http://docs.mongodb.org/ecosystem/tutorial/ruby-driver-tutorial/#gridfs)。

我正在使用 Ruby 2.2.1、mongo 驱动程序 2.0.4 和 mongo db 3.0.1。 我的代码:

eDatabase = Mongo::Client.new(......)
@grid = @eDatabase.database.fs


myvideo = File.open("files/33mo.mov", 'rb')

grid_file = Mongo::Grid::File.new(myvideo.read, :filename => "myvideo.mov")
@grid.insert_one(grid_file)

还有我的日志:

21/05/2015 11:12:25] ERROR : Exception in main loop : Document exceeds allowed max BSON size. The max is 16777216.
[21/05/2015 11:12:25] ERROR : Backtrace : /Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/protocol/serializers.rb:157:in `serialize'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/protocol/message.rb:153:in `block in serialize_fields'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/protocol/message.rb:141:in `each'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/protocol/message.rb:141:in `serialize_fields'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/protocol/message.rb:70:in `serialize'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connection.rb:123:in `block in write'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connection.rb:122:in `each'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connection.rb:122:in `write'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connectable.rb:66:in `block in dispatch'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/loggable.rb:44:in `log'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/loggable.rb:65:in `log_debug'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connectable.rb:65:in `dispatch'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/operation/executable.rb:35:in `block in execute'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/connection_pool.rb:99:in `with_connection'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/server/context.rb:63:in `with_connection'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/operation/executable.rb:34:in `execute'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/operation/write/insert.rb:71:in `execute_write_command'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/operation/write/insert.rb:61:in `execute'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/collection.rb:196:in `insert_many'
/Users/Atome/.rvm/gems/ruby-2.2.1/gems/mongo-2.0.4/lib/mongo/grid/fs.rb:78:in `insert_one'
server.rb:530:in `handle_addobject_message'

仅供参考,线 server.rb:530 对应于

@grid.insert_one(grid_file)

注意事项:

  • 同样的代码在
  • 当我使用 mongofiles 命令时一切正常...
  • 数据库中的其他插入在我的应用程序中工作正常

感谢您的帮助

【问题讨论】:

  • 不是 Ruby 开发者。 GridFS 可以存储大于 16MB 的文件,这是正确的;但是,该文件被分成存储在fs.chunks 中的块(默认情况下)。默认块大小为 255K。文件的元数据(文件名、文件 ID、模式等)存储在 fs.files 中。这两个集合一起构成了 GridFS。我很好奇它是在 fs.chunks 中创建多个块,还是只创建一个大块(大于 255K)?
  • @zammuts :感谢您的回答。两个 cmets:你说“不是 Ruby 开发者 GridFS 可以存储大于 16Meg 的文件”,但这正是 GridFS 的优势,即将大文件存储在 mongodb 中。那么,如何在 ruby​​ 应用程序中使用 GridFS(除了从代码中调用 mongofiles)?第二条评论,默认情况下,块大小为 255 K。因此,如果您有一个 1 MB 的文件,它将被分成 4 个具有共同 id 的块。但是,如果您想要更小或更大的块,您仍然可以将此块大小更改为您想要的任何大小。
  • 那是两句话:“我不是 Ruby 开发人员”和“GridFS 可以存储大于 16MB 的文件”。 - 第二:没错,只要确保块大小不大于 16MB。
  • 好的,但是,我使用的块大小是 255 K,它不起作用......当使用与
  • 仅供参考,我已通过电话与 mongodb 代表联系。她让我在 Mongodb 谷歌组 (groups.google.com/forum/#!searchin/mongodb-user/…) 中发布这个问题,昨天发布的答案提到:“感谢您报告此问题。如果您愿意,我已经在 ruby​​ 驱动程序 JIRA 项目中打开了一张票跟踪它:jira.mongodb.org/browse/RUBY-946 一个修复程序正在代码审查中,将很快与 2.0.5 一起发布”

标签: ruby mongodb gridfs


【解决方案1】:

根据mongodb jira ticket RUBY-946,这是一个错误,应该在新发布的 Ruby 驱动程序 2.0.5 中更正。 见this google group中的评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2016-11-12
    • 2017-12-26
    相关资源
    最近更新 更多