【发布时间】:2011-10-18 16:37:59
【问题描述】:
好的,这有点复杂,所以我会尽量说清楚。
我有一个用来构建某种票务系统的结构。
父集合:线程
嵌入式集合:消息(一个线程嵌入 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} }
简单地说,我查询所有包含至少一条消息的线程 里面没有“4d5a62ac29e1676226000050”的键 read_time 属性。
现在奇怪的部分是……这个查询有效,但不是一直有效! 它只返回我期望看到的线程子集。一世 对于以下情况,还不能确定确切的模式 不起作用,但似乎当有多个消息时 一个线程并且“许多”其他用户已经阅读了它们,但不是用户 我正在查询,那么有问题的线程不会出现在 结果......我不知道为什么。如果我手动查询文档 我看到了我期待的所有数据(就像上面的例子一样),但是 线程被简单地忽略了......
请帮忙!
亚历克斯
【问题讨论】:
-
在所有可能的方向上进行了大量测试之后,似乎以下查询可以正常工作:{ "messages" => { "$elemMatch" => { "read_time. #{u.id.to_s}" => { "$exists" => false}}}} 但这对我来说没有意义......添加 $elemMatch 应该完全没有区别,因为只有“一个”属性在查询中??亚历克斯
标签: ruby-on-rails-3 mongodb mongoid mongodb-ruby