当前位置:  开发笔记 > 编程语言 > 正文

如何在Mongoid中引用嵌入式文档?

如何解决《如何在Mongoid中引用嵌入式文档?》经验,为你挑选了3个好方法。

使用Mongoid,假设我有以下类:

class Map
  include Mongoid::Document

  embeds_many :locations
end

class Location
  include Mongoid::Document

  field :x_coord, :type => Integer
  field :y_coord, :type => Integer

  embedded_in      :map, :inverse_of => :locations
end


class Player
  include Mongoid::Document

  references_one   :location
end

正如您所看到的,我正在尝试建模一个简单的游戏世界环境,其中地图嵌入位置,并且玩家将单个位置作为当前位置.

使用这种方法,当我尝试引用Player类的"location"属性时,我收到以下错误:

Mongoid::Errors::DocumentNotFound: Document not found for class Location with id(s) xxxxxxxxxxxxxxxxxxx.

我的理解是,这是因为位置文档是嵌入式的,因此很难在其嵌入文档(Map)的范围之外引用.这是有道理的,但我如何建模对嵌入式文档的直接引用?



1> Dave Rapin..:

因为Maps是他们自己的集合,所以您需要遍历搜索引擎所在位置的每个Map集合.

您无法直接访问嵌入的文档.您必须通过该集合进入并按下工作.

为避免迭代所有地图,您可以在Player文档中存储位置参考和地图参考.这允许您链接选择Map的条件,然后选择其中的位置.您必须在Player类上编写一个方法来处理这个问题.

def location
  self.map.locations.find(self.location_id)
end

所以,类似于你自己的回答,除了你仍然可以将location_id存储在你的播放器文档中而不是使用coord属性.

另一种方法是将地图,位置和播放器放在他们自己的集合中,而不是在Map集合中嵌入Location.然后你可以使用引用关系而不做任何花哨的事情......但是你真的只是使用分层数据库就像它在这一点上的关系数据库...


我相信你不需要单独存储地图ID:`Maps.where('locations._id'=> player.location_id)` - 只需确保你设置正确的索引(索引地图由'locations._id ")

2> bowsersenior..:

请继续投票选择MongoDB问题跟踪器上的"虚拟馆藏"功能:

http://jira.mongodb.org/browse/SERVER-142

这是第二个最受欢迎的功能,但它仍未安排发布.也许如果有足够的人投票支持它并将其转移到第一,MongoDB团队将最终实施它.



3> Dan Healy..:

在我的用例中,外部对象不需要引用嵌入的文档.从mongoid用户组,我找到了解决方案:在嵌入文档上使用referenced_in,在外部文档上使用NO引用.

class Page
  include Mongoid::Document
  field :title

  embeds_many :page_objects
end

class PageObject
  include Mongoid::Document
  field :type

  embedded_in       :page,    :inverse_of => :page_objects
  referenced_in     :sprite
end

class Sprite
  include Mongoid::Document
  field :path, :default => "/images/something.png"
end

header_sprite = Sprite.create(:path => "/images/header.png")
picture_sprte = Sprite.create(:path => "/images/picture.png")

p = Page.create(:title => "Home")
p.page_objects.create(:type => "header", :sprite => header_sprite)
p.page_objects.first.sprite == header_sprite


这是完全可行的,因为您在嵌入式集合中引用顶级集合.OP想要做的是"从它的父集合之外引用嵌入式集合",这是完全不同的事情.例如,如果您需要从Sprite访问嵌入的PageObject ...您必须通过父页面集合才能找到它.或者在我的响应中,您可以在Sprite中存储Page和PageObject引用,这样您就不必遍历整个Page集合.
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有