好的,这有点复杂,所以我会尽量清楚。
我有一个用来构建某种票务系统的结构。
父集合:线程
嵌入式集合:消息(一个线程嵌入 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”键。
现在奇怪的部分......是这个查询有效,但不是一直有效!它只返回我期望看到的线程子集。对于不起作用的情况,我还无法确定确切的模式,但似乎当线程中有多个消息并且“许多”其他用户已阅读它们时,但不是用户我正在查询,然后有问题的线程没有出现在结果中......我不知道为什么。如果我手动查询文档,我会看到我期望的所有数据(就像上面的示例一样),但是线程被简单地忽略了......
请帮忙 !
亚历克斯