在 Mongo 的集合之间移动文档(通过 Mongoid)
Posted
技术标签:
【中文标题】在 Mongo 的集合之间移动文档(通过 Mongoid)【英文标题】:Moving document between collections in Mongo (via Mongoid) 【发布时间】:2011-09-19 18:28:12 【问题描述】:我正在构建一个纸牌游戏(基本的 52 张纸牌,4 套 * 13 个等级),我已经决定使用 MongoDB 来完成这个项目。
我的基本模型是: --> 游戏 --> 甲板 --> 卡片 --> 玩家 --> 手(作为甲板) --> 卡片 --> Final(作为甲板) --> 卡片 --> 关闭(作为甲板) --> 卡片
理想情况下,我希望将游戏牌组中的牌转移到玩家拥有的不同牌堆中。
但是,执行以下操作:game.players[0].hand.cards.push(game.deck.cards.shift(1))
不起作用,相关卡片不会从游戏的牌库中移除(因为永远不会调用 #delete),也不会添加到玩家的手牌(来自我的理解有限,Mongoid 只会将 new 对象添加到嵌入式集合中。)
所以要将一张牌从一堆移到另一堆,我基本上必须这样做: 游戏 = Game.first player = game.players.first
card = game.deck.cards.shift
copy = Card.new(card.card_id) #read,create
player.hand.cards << copy
if player.save!
card.delete #delete
game.save
end
难度不大,但我基本上是在执行读取、销毁和创建,以基本上模拟可能非常简单的更新。
我有什么遗漏吗?这是 Mongoid ODM 的限制吗?在集合之间移动文档是一个巨大的禁忌吗?
我非常愿意接受有关模型的建议,因为我不知道嵌入式文档是否适合此类问题。
下面是对应的样板
class Deck
include Mongoid::Document
field :is_deck, :type => Boolean
embedded_in :game
embedded_in :player
embeds_many :cards
end
class Card
include PlayingCards
include Mongoid::Document
embedded_in :deck
field :card_id, :type => Integer
field :idx, :type => Integer #used to maintain shuffled order since mongodb is insertion order
field :rank, :type => String
field :suit, :type => String
end
class Game
include Mongoid::Document
embeds_one :deck #deck players draw from
embeds_many :players
field :current_player, type: Integer
field :num_players, type: Integer
end
class Player
include Mongoid::Document
embedded_in :game
embeds_one :hand, class_name: "Deck"
embeds_one :closing, class_name: "Deck"
embeds_one :final, class_name: "Deck"
end
提前致谢!
【问题讨论】:
【参考方案1】:您应该了解嵌入式关联和引用关联之间的区别。
例如
class Parent
embeds_one :child
end
class Child
embedded_in :parent
end
Object child = Child.new 不能被创建 它只能通过 Parent 访问并在该 lavel 或 destroy 上创建。
因此,如果您想实现目标,则需要考虑想要实现的目标。
embedded_in :game
embedded_in :player
所以这已经错了。这应该被(如果我正确理解想法)引用。您不能在 2 个文档中嵌入 1 个对象。这不是用于嵌入式的。
http://mongoid.org/docs/relations/embedded.html http://mongoid.org/docs/relations/referenced.html
阅读本文。
【讨论】:
以上是关于在 Mongo 的集合之间移动文档(通过 Mongoid)的主要内容,如果未能解决你的问题,请参考以下文章
mongo 查询 距离 某个点 多少 米距离 感谢 提供的数据。 感谢 mvc的 demo 。反正 就是各种感谢 文档之类的。