【问题标题】:Ingesting data into MongoDB causes "stack level too deep"将数据摄取到 MongoDB 会导致“堆栈级别太深”
【发布时间】:2012-05-15 23:06:23
【问题描述】:

我有一堆记录存储在 mongodb 集合 (StudentRecord) 中。这些需要分解为具有嵌入式文档 StudentGrade 的 Student 类型的集合。出于某种原因,我用来执行此摄取的 rake 任务不断达到“堆栈级别太深”。我无法检测到任何递归调用,我正在使用 bundle exec 来执行它(ruby 1.9.2-p320)。

任务:parse_student_records =>:环境做 StudentRecord.all.each{|student_record| 学生 = Student.create({:name => student_record.name}) student.grades « Grade.create({:score => student_record.grade_score) 学生。保存! } 结尾 班级学生 包括 MongoMapper::Document 许多:等级 键:名称,字符串 结尾 班级成绩 包括 MongoMapper::EmbeddedDocument 键:grade_score,字符串 结尾

将文档提取为独立文档而不是嵌入文档可以解决此问题..由于某种原因,嵌入会导致问题。

【问题讨论】:

    标签: ruby-on-rails mongodb mongomapper


    【解决方案1】:

    那是issue 265,是我知道的少数几个号码之一。

    为了让回调以正确的顺序在嵌入文档上触发,MongoMapper 必须构建一个随嵌入文档数量线性增长的巨大堆栈。在大约 600-800 个文档时,堆栈溢出。

    ActiveSupport::Callbacks 是一个巨大的混乱,需要重写才能干净利落地避开问题(Rails 头脑中没有那么混乱,但仍然需要重写)。

    问题 265 中的当前提案是禁用回调。

    # in Gemfile
    gem 'mongo_mapper', :git => 'git://github.com/jnunemaker/mongomapper.git', :ref => 'fefec91027f2dd8eb1ab9caa5a4b0acd000f4da7'
    

    然后:

    class Student
      include MongoMapper::Document
      embedded_callbacks_off
      # ...
    end
    

    【讨论】:

    • 非常感谢您发现此问题。浪费了一整天的时间让这个工作。我已经按照线程中的建议尝试了 MM 0.8.6,但遇到了其他问题。最终可能会等待上述修复程序与更新版本一起出现。再次感谢
    • 男人!你是救命恩人!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2012-03-04
    • 2013-10-05
    • 2011-11-17
    • 2012-07-24
    • 2016-08-02
    相关资源
    最近更新 更多