0

I持ちの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 
        } 
        ... 
      ] 
    } 
} 

私は、last_readがnullのサブアレイ、personalgroupからの会話の数をカウントします与えられたユーザ。どうすればいいですか?

私が試した:

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

を彼が出力を希望取得できませんでした。どんな良いアイデアをください?

答えて

1

次のクエリは、last_readnullを持っpersonalgroupアレイの下にサブ文書の数をカウントを確認してください。

$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 } 
0

質問ごとに、にはnullが含まれています。このためには、$inを集計し、次にunwindpersonal配列を使用して配列を数えます。怒鳴る集計クエリ

db.collection.aggregate({ 
    "$match": { 
     "conversations.group.last_read": { 
      "$in": [null] 
     } 
    } 
}, { 
    "$unwind": "$conversations.personal" 
}, { 
    "$group": { 
     "_id": "$_id", 
     "personalArrayCount": { 
      "$sum": 1 
     } 
    } 
}) 
関連する問題