0

私はmongodbに次の文書構造を持っています

{
    "_id" : "123",
    "first_name" : "Lorem",
    "last_name" : "Ipsum",
    "conversations" : {
            "personal" : [
                    {
                            "last_message" : "Hello bar",
                            "last_read" : 1474456404
                    },
                     {
                            "last_message" : "Hello foo",
                            "last_read" : 1474456404
                    },
                    ...
            ],

            "group" : [
                    {
                            "last_message" : "Hello Everyone",
                            "last_read" : null
                    }
                    ...
            ]
    }
}

特定のユーザーについて、サブ配列personalからgroupの会話の数を数えたいと思います。last_readどうすればこれを達成できますか?

私は試した:

db.messages.aggregate(
   [
    { $match: {"_id":"123", 'conversations.$.last_read': null }},
      {
         $group: {
            {$size: "$conversations.personal"}, {$size: "$conversations.group"}
         }
      }
   ]
);

しかし、彼が望む出力を得られませんでした。もっと良いアイデアはありますか?

4

2 に答える 2

1

personal次のクエリは、およびgroup配列の下にあるlast_readvalueを持つサブドキュメントの数をカウントしますnull

$concatArrays複数の配列を 1 つの配列に結合します。MongoDB 3.2 で導入されました。

db.collection.aggregate([
                        { "$match": {"_id":"123", 'conversations.$.last_read': null }},
                        { "$project":{"messages":{$concatArrays : ["$conversations.personal","$conversations.group"]}}}, 
                        { "$unwind": "$messages"}, {$match:{"messages.last_read": null}}, 
                        { "$group":{"_id":null, count: {$sum:1}}}
                ])

サンプル結果:

{ "_id" : null, "count" : 3 }
于 2016-09-21T17:15:00.573 に答える