HASH上的简单MongoDB查询无法按预期工作(仅在某些条件下)

时间:2011-10-18 16:38:00

标签: ruby-on-rails-3 mongodb mongoid mongodb-ruby

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

我有一个用来构建某种票务系统的结构。

父集合:线程

嵌入式集合:消息(线程嵌入0..N消息)

在消息中,我有一个HASH类型的属性“read_time” keys是用户的OID,值是datetime。 Thread的一组示例数据看起来像

_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 
                                               } 
                          } 
                    ] 

这里的想法是仅对UNREAD的线程构建查询 对于给定的作者。通过上面给出的示例,具有OID的用户 4d5a62ac29e1676226000050已读取该线程的第一条消息但是 不是第二个(因为read_time哈希不包含条目 关键“4d5a62ac29e1676226000050”)。

我的查询看起来很喜欢这个,这在我看来非常简单 意见和应该完美无缺,但结果是相当的 意外......

{ "support_messages.read_time.4d5a62ac29e1676226000050" : { "$exists" : false} } 

简单地说,我查询包含至少一条消息的所有线程 它没有“4d5a62ac29e1676226000050”的关键字 read_time属性。

现在奇怪的部分......这个查询有效,但不是所有的时间! 它只返回我期望看到的线程的子集。一世 尚无法确定具体情况的确切模式 不起作用,但似乎当有多个消息时 一个线程和“很多”其他用户已经读过它们,但不是用户 我正在查询,然后有问题的线程没有出现在 结果......我不明白为什么。如果我手动查询文档 我看到了我期待的所有数据(就像上面的例子一样),但是 简单地忽略了线程......

请帮忙!

Alex

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望4e8b281429e167765d00001a4d5a7dfe29e16749580000134d5a62ac29e1676226000050成为第一个read_time下内部哈希的键。 但是我无法在({say})4e8b281429e167765d00001a2011-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 
}