使用数组项在mongoDB中进行组查询以计算总和

时间:2015-01-26 13:20:44

标签: mongodb aggregation-framework

我的集合中的每个文档都有一个数组属性,该数组包含具有total,index等属性的对象。我想用第二个数组元素的total属性的总和对文档进行分组,比如下面的查询。我怎样才能实现呢?

我想让这个查询起作用:

db.nwt_envio_contacto.aggregate({  
   $project:{  
      "visualizacoes":true,
      "envio_id":true
   }   ‌​
},
{  
   $match:{  
      "envio_id":ObjectId("54c5ed8101ec09c26c7b23c6"),
      "visualizacoes":{  
         $elem‌​Match:{  
            "index":1
         }
      }
   }
},
{  
   $group:{  
      _id:null,
      total:{  
         $sum:"visualizacoes.$.total"
      }
   }
})

假设我有一个包含此文档的集合:

{
   "_id":ObjectId("54c5ed8101ec09c26c7b23c8"),
   "envio_id":ObjectId("54c5ed8101ec09c26c7b23c6"),
   "visualizacoes":[
      {
         "primeira":"2015-01-26 09:34:58",
         "ultima":"2015-01-26 14:17:18",
         "index":2,
         "total":4
      },
      {
         "primeira":"2015-01-26 09:35:13",
         "ultima":"2015-01-26 09:35:43",
         "index":2,
         "total":3
      }
   ]
}

基本上我想总结索引等于1的所有visualizacoes对象的总属性。

1 个答案:

答案 0 :(得分:1)

此聚合将对索引等于1的所有visualizacoes对象求和:

db.nwt_envio_contacto.aggregate([
    {$match:{
        "envio_id":ObjectId("54c5ed8101ec09c26c7b23c6")
    }},
    {$unwind: "$visualizacoes"},
    {$match:{
        "visualizacoes.index":1
    }},
    {$group:{
        _id:null,
        total:{  
            $sum:"$visualizacoes.total"
        }
    }}
])

您可以使用$unwind运算符展平数组,在过滤索引为1的条目后,您就可以求和了。