在 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 。反正 就是各种感谢 文档之类的。

NodeJS/Mongo:通过各种集合循环查询

MongoDB 将数据移动到集合之间的文档中

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

MongoDB - 对时间序列子文档进行范围查询

mongo中一个文档的字段是list,怎么删除list中的数据