わかりました、少し複雑なので、明確にしようと思います。
ある種のチケットシステムを構築するために使用する構造があります。
親コレクション: スレッド
埋め込みコレクション: メッセージ (スレッドは 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 つ含むすべてのスレッドを照会します。
今の奇妙な部分は...このクエリは機能しますが、常にではありません! 私が期待しているスレッドのサブセットのみを返します。機能しないケースの正確なパターンをまだ特定できていませんが、スレッドに複数のメッセージがあり、「多くの」他のユーザーがそれらを読んだが、ユーザーは読んでいないようですクエリを実行しているのですが、問題のスレッドが結果に表示されません...理由がわかりません。ドキュメントを手動でクエリしている場合、期待しているすべてのデータが表示されます (上記の例のように) が、スレッドは単純に無視されます...
助けてください !
アレックス