【问题标题】:Using Mongoid: Can you use embed_in in multiple documents at the same time?使用 Mongoid:可以在多个文档中同时使用 embed_in 吗?
【发布时间】:2015-07-25 12:10:13
【问题描述】:

我已经习惯了使用 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 不存在。

那是怎么回事?

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

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

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

【问题讨论】:

    标签: ruby mongodb mongoid relationship nosql


    【解决方案1】:

    您不想使用embeds_many。这会将文档“嵌入”到父文档中,然后将其嵌入到多个父文档中是没有意义的,因为您的 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
    

    【讨论】:

    • 谢谢马丁。我想我现在明白 Embeds_in 的作用了。绝对是一个令人困惑的功能,但非常有用。
    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多