2016-12-27 50 views
0

的計數的所有文件在我目前的項目中,我有一個這樣的結構:的MongoDB - 選擇由陣列場

"squad": { 
    "members": [ 
     { 
      "name": "xyz", 
      "empty": true 
     }, 
     { 
      "name": "xyz", 
      "empty": true 
     }, 
     { 
      "name": "xyz", 
      "empty": true 
     } 
    ] 
} 

現在我想查詢與具有至少MongoDB的每一個隊,可以說3空的成員插槽。我google了,只發現聚合和$大小,這似乎只選擇一個數組計數不是每場。
任何想法如何做到這一點?

回答

0

你可以試試這個查詢:

db.getCollection('collectionName').aggregate([ 
    {$unwind:"$squad.members"}, 
    {$group:{_id:"$_id",count:{$sum:{$cond: [{$eq: ['$squad.members.empty', true]}, 1, 0]}}}}, 
    {$match: {count: {$gte: 3}}} 
]) 

在此查詢應用條件的總和然後檢查計數大於大於或等於3

0

這將返回所有文件,將空槽比3

db.squad.aggregate([ 
    {$unwind:"$squad.members"}, 
    {$match:{"squad.members.empty": true}}, 
    {$group:{_id:"$_id",count:{$sum:1}}}, 
    {$match: {count: {$gt: 3}}} 
]) 
0

您可以使用$過濾器的匹配空插槽條目更大。接下來計算$ size並將其與輸入值和項目進行比較以清空插槽和$ match stage以輸出空插槽值等於true的文檔。

aggregate({ 
    $project: { 
     "emptyslots": { 
      $eq: [{ 
       $size: { 
        $filter: { 
         input: "$squad.members", 
         as: "slot", 
         cond: { 
          $eq: ["$$slot.empty", true] 
         } 
        } 
       } 
      }, 3] 
     }, 
     data: "$$ROOT" 
    } 

}, { 
    $match: { 
     "emptyslots": true 
    } 
}); 

這個版本結合了項目和比賽階段進入一個$纂與$ COND運營階段,以決定是否保留或修剪的元素。

aggregate([{ 
    "$redact": { 
     "$cond": [{ 
       $eq: [{ 
        $size: { 
         $filter: { 
          input: "$squad.members", 
          as: "slot", 
          cond: { 
           $eq: ["$$slot.empty", true] 
          } 
         } 
        } 
       }, 3] 
      }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    } 
}])