好的,这有点复杂,所以我会尽量清楚。
我有一个用来构建某种票务系统的结构。
父集合:线程
嵌入式集合:消息(线程嵌入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
答案 0 :(得分:0)
如果我理解正确,您希望4e8b281429e167765d00001a
,4d5a7dfe29e1674958000013
,4d5a62ac29e1676226000050
成为第一个read_time
下内部哈希的键。
但是我无法在({say})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
}