Ruby on rails 3 哈希上的简单MongoDB查询未按预期工作(仅在某些情况下)
好的,有点复杂,所以我会尽量说清楚 我有一个我用来建立某种票证系统的结构 父集合:线程 嵌入的集合:消息线程嵌入0..N条消息 在消息中,我有一个HASH类型的属性read_time,其中 键是用户的OID和日期时间的值。 线程的一组示例数据如下所示Ruby on rails 3 哈希上的简单MongoDB查询未按预期工作(仅在某些情况下),ruby-on-rails-3,mongodb,mongoid,mongodb-ruby,Ruby On Rails 3,Mongodb,Mongoid,Mongodb Ruby,好的,有点复杂,所以我会尽量说清楚 我有一个我用来建立某种票证系统的结构 父集合:线程 嵌入的集合:消息线程嵌入0..N条消息 在消息中,我有一个HASH类型的属性read_time,其中 键是用户的OID和日期时间的值。 线程的一组示例数据如下所示 _id "4e9806c223349f0001000044" author_id {"$oid": "4e8b281429e167765d00001a"} created_at
_id "4e9806c223349f0001000044"
author_id {"$oid": "4e8b281429e167765d00001a"}
created_at 2011-10-14 09:54:10 UTC
ref 252
status "open"
...
messages
[
0
{
_id {"$oid": "4e9806c223349f0001000045"}
author_id {"$oid": "4e8b281429e167765d00001a"}
content "Hello"
created_at 2011-10-14 09:54:11 UTC
read_time
{
4e8b281429e167765d00001a 2011-10-14 09:54:11 UTC
4d5a7dfe29e1674958000013 2011-10-14 11:48:18 UTC
4d5a62ac29e1676226000050 2011-10-15 06:44:21 UTC
}
},
1
{
_id {"$oid": "4e9806c223349f0001000046"}
author_id {"$oid": "4e8b281429e167765d00001a"}
content "Hello 2"
created_at 2011-10-14 09:54:11 UTC
read_time
{
4e8b281429e167765d00001a 2011-10-15 09:54:11 UTC
4d5a7dfe29e1674958000013 2011-10-16 11:48:18 UTC
}
}
]
这里的想法是只对未读的线程构建一个查询
对于给定的作者。在上面给出的示例中,使用OID的用户
4d5a62ac29e1676226000050已读取线程的第一条消息,但
不是第二个,因为读取时间哈希不包含
钥匙4d5a62ac29e1676226000050
我的问题看起来是这样的,在我看来这是非常直截了当的
意见和建议应该完美无瑕,但结果相当令人满意
出乎意料
{ "support_messages.read_time.4d5a62ac29e1676226000050" : { "$exists" : false} }
简单地说,我查询至少包含一条消息的所有线程
其内部没有4d5a62ac29e1676226000050的密钥
读取时间属性
奇怪的部分现在。。。这个查询是有效的,但不是一直有效!
它只返回我希望看到的线程的子集。我
目前还无法确定发生这种情况的确切模式
不起作用,但似乎当邮件中有多条消息时
一个线程,许多其他用户都读过,但用户没有读过
我正在查询,那么有问题的线程不会出现在
后果我不知道为什么。如果我手动查询文档
我看到了我期望的所有数据,就像上面的例子一样,但是
线程被忽略
请帮忙
Alex如果我理解正确,您希望4e8b281429e167765d00001a、4d5a7dfe29e1674958000013、4d5a62ac29e1676226000050成为第一次读取时内部哈希的键。 但我看不到4e8b281429e167765d00001a和2011-10-14 09:54:11 UTC之间有任何冒号 我希望它是:
read_time
{
4e8b281429e167765d00001a : 2011-10-14 09:54:11 UTC
4d5a7dfe29e1674958000013 : 2011-10-14 11:48:18 UTC
4d5a62ac29e1676226000050 : 2011-10-15 06:44:21 UTC
}
在尽可能多的方向上进行了大量测试之后,以下查询对于我来说似乎工作正常:{messages=>{$elemMatch=>{read_time.{u.id.to_s}=>{$exists=>false}}},但对我来说没有意义。。。添加$elemMatch应该不会有任何区别,因为查询中只有一个属性??亚历克斯