Ruby on rails Mongoid有很多关系,枚举时返回假数据
我将简要介绍一下背景情况。我正在使用以下(总结)模型在Rails中构建一个有向图: 及 我在Mongoid中遇到了两个奇怪的问题,Mongoid有很多,并且属于关系。关系查询的结果似乎有所不同,这取决于我使用什么方法检索Ruby on rails Mongoid有很多关系,枚举时返回假数据,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我将简要介绍一下背景情况。我正在使用以下(总结)模型在Rails中构建一个有向图: 及 我在Mongoid中遇到了两个奇怪的问题,Mongoid有很多,并且属于关系。关系查询的结果似乎有所不同,这取决于我使用什么方法检索节点对象 首先,调用对关系中的a进行调用(以及对关系进行枚举,即每个,映射,收集)会导致检索额外的边,如下所示,其中计数返回为31 第二个,额外的边缘问题似乎只在检索节点的查询与直接的查找不同时发生。但正如您所看到的,根据Rails,node1等于node2 如果有人能解释这些问
节点
对象
首先,调用对关系中的a
进行调用(以及对关系进行枚举,即每个
,映射
,收集
)会导致检索额外的边
,如下所示,其中计数返回为31
第二个,额外的边缘
问题似乎只在检索节点
的查询与直接的查找不同时发生。但正如您所看到的,根据Rails,node1
等于node2
如果有人能解释这些问题,我将不胜感激。如果其他信息有帮助,请告诉我
1.9.3-p327 :145 > node1 = some_other_node.neighbors.select {|n| n[:node].city == "983"}.first[:node]
=> #<Node _id: 54da32b1756275343ed70300, city: "983">
1.9.3-p327 :140 > node2 = Node.find_by(:city => "983")
=> #<Node _id: 54da32b1756275343ed70300, city: "983">
1.9.3-p327 :141 > node1 == node2
=> true
1.9.3-p327 :150 > node1.edges.count
=> 30
1.9.3-p327 :151 > node1.edges.to_a.count
=> 31
1.9.3-p327 :152 > node2.edges.count
=> 30
1.9.3-p327 :153 > node2.edges.to_a.count
=> 30
这里有更多的证据支持我的主张。请注意,所有的node2
边都将node2
作为源
,但对于node1
,情况并非如此
1.9.3-p327 :170 > node2.edges.to_a.collect {|e| e.source == node2}.include? false
=> false
1.9.3-p327 :171 > node1.edges.to_a.collect {|e| e.source == node1}.include? false
=> true
然而,特别的是,额外的边缘将城市:“0”
作为源,因为在节点1
的初始分配中,一些其他节点
是城市:“0”
。这似乎不是巧合。问题解决了!谢谢你的建议,mu太短了。当我试图在节点
上同时实现out\u边
和in\u边
时,我发现Mongoid抱怨反向关系不明确。有趣的是,当我只定义out\u边时,它很高兴地保持沉默
只是想澄清一下,定义外边缘和内边缘都不需要这一点,我能够通过在边缘
模型中包含反向定义来消除缺陷
Node
has_many :edges, foreign_key: "source_id"
Edge
field :source_id, :type => String
field :destination_id, :type => String
belongs_to :source, inverse_of: "edges", class_name: "Node"
belongs_to :destination, inverse_of: "in_edges", class_name: "Node"
编辑
Rails/Mongoid似乎并不关心目的地
是通过反向定义的:“in_边”
定义的,即使节点中不存在in_边
。但是,如果我删除了该部分,那么问题将再次出现。Mongoid在这里肯定有一些缺陷。您是否检查过节点1.edges中的额外元素。to a
看起来是什么样子?是的,我有,请查看更新的答案以了解有关额外边的更多信息。您的节点是否应该有多个:in\u边
和有多个:out\u边
?不一定,要完整,我会说是的,但对于功能,我只需要能够检索出外边缘
。我想知道。是的,我发现Mongoid中的非嵌入关系有时表现得很奇怪。有时你需要同时设置的多个
和所属的
,有时你不需要;有时你需要:与相反,有时你不需要。
1.9.3-p327 :167 > node1.edges.to_a.last.source
=> #<Node _id: 54da32b0756275343e000000, city: "0">
1.9.3-p327 :170 > node2.edges.to_a.collect {|e| e.source == node2}.include? false
=> false
1.9.3-p327 :171 > node1.edges.to_a.collect {|e| e.source == node1}.include? false
=> true
Node
has_many :edges, foreign_key: "source_id"
Edge
field :source_id, :type => String
field :destination_id, :type => String
belongs_to :source, inverse_of: "edges", class_name: "Node"
belongs_to :destination, inverse_of: "in_edges", class_name: "Node"