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



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

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

父集合:Thread

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

在消息中,我有一个HASH类型的属性"read_time",其中键是用户的OID,值是日期时间。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属性。

现在奇怪的是…是这个查询工作,但不是所有的时间!它只返回我期望看到的线程的子集。我还没能确定这些案件的确切模式不工作,但似乎有一个以上的消息在一个线程,并且"许多"其他用户已经阅读了它们,但不是用户我正在查询,那么有问题的线程不会出现在结果……我也不知道为什么。如果我手动查询文档我看到了我期望的所有数据(就像上面的例子一样),但是线程被简单地忽略…

请帮忙!

亚历克斯

如果我理解正确,您希望4e8b281429e167765d00001a, 4d5a7dfe29e1674958000013, 4d5a62ac29e1676226000050是第一个read_time下的内部散列的键。但是我看不到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 
}

相关内容

  • 没有找到相关文章

最新更新