【问题标题】:Mongoid : Embedded documents are saved under the wrong parentMongoid : 嵌入文档保存在错误的父级下
【发布时间】:2014-09-01 15:45:50
【问题描述】:

当保存具有 3 层嵌套的文档时,子对象保存在错误的父对象下:

user = User.create
website = user.websites.create
post = website.posts.create
post2 = website.posts.create

post.images.create
post2.images.create

puts "#{user.to_json}"
puts "#{user.reload.to_json}"

每个帖子都应该有一个图像,这在脏用户对象 (user.to_json) 上是正确的 => https://gist.github.com/vdaubry/cdc465d6d5ef84576830

但是当我重新加载用户时,所有图像都嵌入在第一个帖子下(user.reload.to_json) => https://gist.github.com/vdaubry/a9c217a467dd9ff9a7fb

这是一个错误还是我遗漏了一些明显的东西?

这里是用来重现这个的类定义:

class User
  include Mongoid::Document
  embeds_many :websites
end

class Website
  include Mongoid::Document
  include Mongoid::Timestamps
  embedded_in :user
  embeds_many :posts

end

class Post
  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :website
  embeds_many :images
end
class Image
  include Mongoid::Document
  include Mongoid::Timestamps
  embedded_in :post
end

我的宝石文件:

ruby 2.1.2p95
gem 'rails', '~> 4.1.4'
gem 'mongoid', '~> 4.0.0'

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    这是一个错误,我不确定错误存在于哪一端,Mongoid 或 MongoDB。发生这种情况是因为 Mongoid 用位置运算符“$”替换了我们要推送的字段的键中的索引,即“websites.0.posts.1.images”更改为“websites.0.posts.$”。图片”。

    引用位置运算符的文档(斜体是我的):

    与 update() 方法一起使用时,

    • 位置 $ 运算符充当 第一个元素的占位符 匹配查询文档,

    在您的情况下,图像文档被插入到创建的第一个帖子文档中,所以这可能是原因。

    我不确定 Mongoid 为什么会这样做(替换为位置运算符)或者是否需要 $push 操作。

    我看到你已经为他们创建了一个问题,所以我也在复制我的 cmets。

    【讨论】:

      【解决方案2】:

      非常感谢您的回答!对于那些有同样问题的人来说,这是 mongo 的一个限制,它不支持多个嵌入式集合级别。

      我将模型重构为仅嵌入 2 级集合。它适用于:

      class User
        include Mongoid::Document
        has_many :websites
      end
      
      class Website
        belongs_to :user
        embeds_many :posts
      end
      
      class Post
        embedded_in :website
        embeds_many :images
      end
      
      class Image
        embedded_in :post
      end
      

      我想让这个工作的最好方法是直接在 mongo jira 上支持潜在的问题:

      https://jira.mongodb.org/browse/SERVER-831

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        • 2016-02-11
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多