使用Mongoid:您可以同时在多个文档中使用embed_in吗?

时间:2015-05-14 01:24:35

标签: ruby mongodb mongoid relationship nosql

我正在使用Mongoid,但我遇到了这个问题,我正在尝试使用Mongoid。

我有一个游戏,游戏有团队,团队有玩家,游戏有相同的玩家。

class Game
  include Mongoid::Document

  embeds_many :Players
  embeds_many :Teams
end

class Team
  include Mongoid::Document

  embedded_in :Game
  embeds_many :Players
end

class Player
  include Mongoid::Document

  embedded_in :Game
  embedded_in :Team
end

现在我使用

运行此代码
game = Game.new( :id => "1" )

game.save

player = Player.new()
game.Players << player

team = Team.new()
game.Teams << team
team.Players << player

我希望有一个游戏,有一个团队,该团队有一个玩家,而且该玩家也在游戏中。

然后我跑

newgame = Game.find("1")
newteam = newgame.Teams.first
newplayer = newgame.Players.first
newplayer2 = newteam.Players.first

newplayer存在,newplayer2不存在。

那是怎么回事?

我是否只允许在一个对象中嵌入文档,是否有办法绕过它?我尝试将其中一个关系设为belongs_to,如果根据输出嵌入文档,则不允许这样做。

我知道我可以改变模型(游戏不需要链接到玩家)我只是想知道这种关系是否违反某些规则,或者是否有一些技巧可以使这项工作如上所述。

作为一个附带问题,有人可以在这种情况下遵守“保存”规则(或者假设玩家没有嵌入团队中)。一旦我设置了这个,我似乎不必保存游戏,团队和播放器来记录嵌入。如果我保存其中任何一个,则自动保存。或者在设置关系后修改它们时我是否必须保存每个单独的文档(假设在建立关系后完成修改)。

1 个答案:

答案 0 :(得分:1)

您不想使用embeds_many。这个&#34;嵌入&#34;将文档放入父文档中,然后将其嵌入多个父文档中是没有意义的,因为那时您的Player数据将在多个位置重复。

想想当数据存储在多个位置时,不断更新和保持数据一致性的噩梦。

您想要使用has_many来建模这些关系。这仅存储父文档中的_id文档,而实际文档存储在单独的集合中,并允许多个父项引用它。

http://mongoid.org/en/mongoid/docs/relations.html#has_many

  

使用Mongoid的has_many和belongs_to宏定义一对多关系,其中子项存储在与父文档不同的集合中。

class Game
  include Mongoid::Document

  has_many :Players
  has_many :Teams
end

class Team
  include Mongoid::Document

  belongs_to :Game
  has_many :Players
end

class Player
  include Mongoid::Document

  belongs_to :Game
  belongs_to :Team
end