RoR3+Mongoid:查询时如何比较集合/表的字段?

Fer*_*doH 5 activerecord ruby-on-rails mongodb mongoid ruby-on-rails-3

我有一个同时具有 :id 和 :group_id 字段的结构。我希望检索 :id 等于 :group_id 的所有数据。

我目前正在使用 mongoid,但我认为该操作的完成方式与使用 Rails3 的 ActiveRecord 时的操作方式相同。

无论如何。我试图使用Message.where(:group_id => :id),它应该返回,例如, this: => #<Message _id: 4e38aa132748440a7e00007d, group_id: BSON::ObjectId('4e38aa132748440a7e00007d')>。但它根本不起作用(看起来好像它确实不应该起作用,但是它应该如何起作用呢?)

如何查询 mongoid (或活动记录)以仅获取 :id 等于 :group_id 的消息?

编辑:只是为了表明这些值实际上完全相同:

ruby-1.9.2-p180 :088 > Message.first.id
=> BSON::ObjectId('4e38aa132748440a7e00007d')
ruby-1.9.2-p180 :089 > Message.first.group_id
=> BSON::ObjectId('4e38aa132748440a7e00007d')
Run Code Online (Sandbox Code Playgroud)

EDIT2:这些不起作用(它们至少有一条匹配的消息(上面的示例)):

ruby-1.9.2-p180 :091 > Message.where("group_id = id").count
 => 0 
ruby-1.9.2-p180 :092 > Message.where("group_id == id").count
 => 0 
Run Code Online (Sandbox Code Playgroud)

EDIT3:以下是应返回的消息示例:http://cl.ly/3q1r20421S3P1921101D

EDIT4:另一个奇怪的地方:

ruby-1.9.2-p180 :034 >  Message.where("this._id = this.group_id").each { 
|m| puts "#{m.id} = #{m.group_id}" }
4e38aa132748440a7e00007d = 4e38aa132748440a7e00007d
4e38aa132748440a7e00007e = 4e38aa132748440a7e00007d
4e38aa562748440a7e000084 = 4e38aa562748440a7e000084
4e38aa562748440a7e000085 = 4e38aa562748440a7e000084
4e38ac312748440a7e000095 = 4e38ac312748440a7e000095
4e38ac312748440a7e000096 = 4e38ac312748440a7e000095
4e38ac312748440a7e000097 = 4e38ac312748440a7e000095
Run Code Online (Sandbox Code Playgroud)

为什么它返回这些值,即使在某些情况下它们不相等?啊啊啊啊啊

EDIT5:另一个奇怪的地方和一个小的不确定的结论:

ruby-1.9.2-p180 :090 >  Message.where("this.read == this.sender_deleted").each { 
|m| puts "#{m.read.to_s},#{m.sender_deleted.to_s}" }
true,true
false,false
false,false
false,false
false,false
Run Code Online (Sandbox Code Playgroud)

我的查询适用于布尔值!因此,它似乎不仅仅适用于 BSON::ObjectId() 对象比较(我也无法通过执行Message.where(:id => Message.first.id[编辑:我设法通过使用 :_id 而不是 :id 来检索消息,但这对我没有帮助关于我剩下的问题])。我如何在同一对象上比较这些该死的标识符?我真的需要这样做,而且恐怕没有优雅的替代方案(将那些完全相同的 ID 存储为字符串会太奇怪,请不要建议它:/)最后,这对于 Mongoid 来说似乎是一个特定问题

obs.:我尝试了所有想到的组合,关于 id _id = ==。是否有任何类似哈希的查询来完成我的需要?使用类似.where(:_id => :group_id)的东西(但不是那个,我的意思是 :group_id 值,而不是 :group_id 符号)。

rub*_*ish 2

Mongoid最终使用的是MongoDB,所以任何在mongodb中做不到的事情都不能用mongoid来完成。目前 mongodb 尚不支持您所讨论的特定用例。

您不能针对字段查询字段,您必须提供要查询的文字值。我在Mongodb Issue Tracker上看到一个支持此问题的问题,但现在无法找到它。

您提到的布尔值查询可能只是一个巧合。这也不应该按预期工作。

更新

可以使用$where子句比较 mongodb 中的字段。