好吧,这有点复杂,所以我会尽量说清楚。
我有一个结构,我用它来建立某种票证系统。
父集合: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
下的内部散列的键。但是我看不到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
}