Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Mongoid有很多关系,枚举时返回假数据_Ruby On Rails_Mongodb_Mongoid - Fatal编程技术网

Ruby on rails Mongoid有很多关系,枚举时返回假数据

Ruby on rails Mongoid有很多关系,枚举时返回假数据,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我将简要介绍一下背景情况。我正在使用以下(总结)模型在Rails中构建一个有向图: 及 我在Mongoid中遇到了两个奇怪的问题,Mongoid有很多,并且属于关系。关系查询的结果似乎有所不同,这取决于我使用什么方法检索节点对象 首先,调用对关系中的a进行调用(以及对关系进行枚举,即每个,映射,收集)会导致检索额外的边,如下所示,其中计数返回为31 第二个,额外的边缘问题似乎只在检索节点的查询与直接的查找不同时发生。但正如您所看到的,根据Rails,node1等于node2 如果有人能解释这些问

我将简要介绍一下背景情况。我正在使用以下(总结)模型在Rails中构建一个有向图:

我在Mongoid中遇到了两个奇怪的问题,Mongoid有很多,并且属于关系。关系查询的结果似乎有所不同,这取决于我使用什么方法检索
节点
对象

首先,调用
对关系中的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"