2014-09-01 45 views
2

保存时文件有3层的嵌套,子对象是错误的父下保存:Mongoid:嵌入式文件是错误的父下保存

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 

我的Gemfile:

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

回答

1

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

引用该位置操作者的文档(斜体字是矿):

当与update()方法中使用,

  • 位置$操作者充当用于第一的占位符元件 ,所述查询文档相匹配,

就你而言,图像文档被插入到创建的第一篇文档中,所以这可能是原因。

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

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

0

非常感谢您的回答!对于那些有相同问题的人来说,它是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 

我猜想得到这个工作最好的办法是直接在蒙戈JIRA upvoting潜在的问题:

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