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 
        } 
        ... 
      ] 
    } 
} 

我想算的談話從子陣列,personalgroup其中last_read是空的數量,對於給定用戶。請問我該如何做到這一點?

我想:

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

,但沒有得到他想要的輸出。請有更好的想法嗎?

回答

1

下面的查詢計算的子文件下personalgroup陣列具有last_readnull數量。

$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_read包含null。爲此,您使用$in進行聚合,然後使用unwindpersonal數組並對數組進行計數。檢查波紋管聚合查詢

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