0

わかりました、少し複雑なので、明確にしようと思います。

ある種のチケットシステムを構築するために使用する構造があります。

親コレクション: スレッド

埋め込みコレクション: メッセージ (スレッドは 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 を持つユーザーがスレッドの最初のメッセージを読みましたが、2 番目のメッセージは読みませんでした (read_time ハッシュにキー "4d5a62ac29e1676226000050" のエントリが含まれていないため)。

私のクエリは次のようになります。これは私の意見では非常に単純で、問題なく動作するはずですが、結果はまったく予想外です....

{ "support_messages.read_time.4d5a62ac29e1676226000050" : { "$exists" : false} } 

簡単に言えば、read_time 属性に「4d5a62ac29e1676226000050」のキーを持たないメッセージを少なくとも 1 つ含むすべてのスレッドを照会します。

今の奇妙な部分は...このクエリは機能しますが、常にではありません! 私が期待しているスレッドのサブセットのみを返します。機能しないケースの正確なパターンをまだ特定できていませんが、スレッドに複数のメッセージがあり、「多くの」他のユーザーがそれらを読んだが、ユーザーは読んでいないようですクエリを実行しているのですが、問題のスレッドが結果に表示されません...理由がわかりません。ドキュメントを手動でクエリしている場合、期待しているすべてのデータが表示されます (上記の例のように) が、スレッドは単純に無視されます...

助けてください !

アレックス

4

1 に答える 1

0

私の理解が正しければ4e8b281429e167765d00001a4d5a7dfe29e16749580000134d5a62ac29e1676226000050を最初の の下の内部ハッシュのキーにする必要がありますread_time4e8b281429e167765d00001aしかし、(としましょう)との間にコロンが見えません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 
}
于 2012-02-20T15:02:42.277 に答える