【问题标题】:Simple MongoDB query on HASH not working as expected (only in some conditions)HASH 上的简单 MongoDB 查询未按预期工作(仅在某些情况下)
【发布时间】: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


【解决方案1】:

如果我理解正确,您希望4e8b281429e167765d00001a4d5a7dfe29e16749580000134d5a62ac29e1676226000050 成为第一个read_time 下的内部哈希的键。 但是我在(比如说)4e8b281429e167765d00001a2011-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 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2012-11-13
    • 2021-05-28
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多