0

次のドキュメント構造があります。

"messages": {
"_id" : ObjectId("515a4de9c1a3c09c19000001"),
"author" : "50fd0d38c1a3c04c27000000",recipient" : "5159a292c1a3c01d5b000005",
"conversation" : [
    {
        "author" : "50fd0d38c1a3c04c27000000",
        "date" : ISODate("2013-04-02T03:18:01.204Z"),
        "message" : "hello test",
        "read" : false
    },
    {
        "message" : "reply test",
        "date" : ISODate("2013-04-02T03:36:57.444Z"),
        "author" : "5159a292c1a3c01d5b000005",
        "read" : true
    }....

conversation.read が false で、未読メッセージの作成者 (conversation.author) が会話を開始した人ではない会話メッセージの総数を取得することは可能ですか?

現在、conversations.read が false であるドキュメントを見つけてから、PHP でそれらをループして conversations.author フィールドを確認しています。これは機能しますが、大量のデータを取得すると速度が低下するのではないかと心配しています。

PHP MongoDB ドライバーを使用しています。

私はこれを試しました..

$unread_conversations = $db->messages->find(
    array(
        'conversation.read'=>false
        'conversation.author'=>array('$ne'=>$_SESSION['account']['_id']->__toString())
    ));

しかし、作者ではなく、読まれていないメッセージが欲しいので、それはうまくいきません。

4

1 に答える 1

0

これは、通常の mongo クエリでは不可能です。集計フレームワークに組み込まれた map-reduce または mongos を使用する必要があります 。

現在のスキーマで目標を達成するには、最初にネストされたリストを巻き戻す必要があります。

他の解決策は、スキーマを変更し、各会話を個別のドキュメントとして保存することです (親会話の ID を含む親フィールドを使用)。

補足として、id フィールドを文字列として保存しないでください。常に ObjectId を使用して mongo ID を保存してください。

于 2013-04-02T05:30:00.740 に答える