2014-09-01 44 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