0

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

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

父集合:线程

嵌入式集合:消息(一个线程嵌入 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 的用户已读取线程的第一条消息,但没有读取第二条消息(因为 read_time 哈希不包含键“4d5a62ac29e1676226000050”的条目)。

我的查询看起来像这样,在我看来这很简单,应该可以完美地工作,但结果却出乎意料....

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

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

现在奇怪的部分......是这个查询有效,但不是一直有效!它只返回我期望看到的线程子集。对于不起作用的情况,我还无法确定确切的模式,但似乎当线程中有多个消息并且“许多”其他用户已阅读它们时,但不是用户我正在查询,然后有问题的线程没有出现在结果中......我不知道为什么。如果我手动查询文档,我会看到我期望的所有数据(就像上面的示例一样),但是线程被简单地忽略了......

请帮忙 !

亚历克斯

4

1 回答 1

0

如果我理解正确,您希望,4e8b281429e167765d00001a成为第一个下的内部哈希的键。但是我在(比如说)和. 之间看不到任何冒号。4d5a7dfe29e16749580000134d5a62ac29e1676226000050read_time4e8b281429e167765d00001a2011-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 
}
于 2012-02-20T15:02:42.277 回答