Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 哈希上的简单MongoDB查询未按预期工作(仅在某些情况下)_Ruby On Rails 3_Mongodb_Mongoid_Mongodb Ruby - Fatal编程技术网

Ruby on rails 3 哈希上的简单MongoDB查询未按预期工作(仅在某些情况下)

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

好的,有点复杂,所以我会尽量说清楚

我有一个我用来建立某种票证系统的结构

父集合:线程

嵌入的集合:消息线程嵌入0..N条消息

在消息中,我有一个HASH类型的属性read_time,其中 键是用户的OID和日期时间的值。 线程的一组示例数据如下所示

_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应该不会有任何区别,因为查询中只有一个属性??亚历克斯