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_readnullpersonalgroup 배열에서 하위 문서의 수를 계산을 확인합니다.

$concatArrays은 여러 개의 배열을 하나로 결합합니다. 그것은 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

질문에 따라 group array last_readnull이 포함되어 있는지 확인하고자합니다. 이를 위해 집계에 $in을 사용하고 unwindpersonal 배열을 사용하고 배열을 계산하십시오. 울부 짖는 소리 집계 쿼리

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