Mongodb Aggregation Pipeline Count跨多个字段的总大小

时间:2017-12-20 03:12:56

标签: mongodb pipeline aggregation

`"ActivityScores" : {
            "Spring" : [
                {
                    "ActivityId" : "8fd38724-7e7d-4518-bd49-d38a8b4b3435", 
                    "ActivityTime" : "2017-05-25T16:07:02.000-06:00"
                }
            ], 
            "Winter" : [
                {
                    "ActivityId" : "90d2a976-19d9-4ce0-aa88-d32c122d173b", 
                    "ActivityTime" : "2017-02-14T22:50:00.000-06:00"
                }
            ], 
            "Fall" : [
                {
                    "ActivityId" : "84b8c41e-788f-4acd-abec-dc455285972b", 
                    "ActivityTime" : "2016-11-15T22:37:02.000-06:00"
                }, 
                {
                    "ActivityId" : "157af880-d47b-42fc-8ecf-ecfc1bbb56b1",  
                    "ActivityTime" : "2016-09-01T22:50:05.000-06:00"
                }
            ]
        }, 
        "Grade" : "2", 
        "GradeTag" : "GRADE_2", `

我正在寻找聚合查询以获得ActivityIds的总和。我尝试了$group$unwind$size $addToset的各种组合,但它们似乎都没有效果。我需要仅使用聚合框架查找总活动。我不想使用javascript或python来查看每个文档以获取总计数。有什么简单的方法吗?

1 个答案:

答案 0 :(得分:0)

谢谢。我们的版本是3.2。最后下面的组合工作。 ActivityScores是我的Schema.Working Aggregation Pipeline中的entity.SchoolYears的字段。

db.studentcontentareadocument.aggregate(
[
{
  $project: { 
      "SpringActivitiesPerDoc" : {
          "$size" : "$entity.SchoolYears.ActivityScores.Spring"
      }, 
      "WinterActivitiesPerDoc" : {
          "$size" : "$entity.SchoolYears.ActivityScores.Winter"
      }, 
      "FallActivitiesPerDoc" : {
          "$size" : "$entity.SchoolYears.ActivityScores.Fall"
      }
  }
},
{
  $project: { 
      "TotalActivitiesPerDoc" : {
          "$add" : [
              "$SpringActivitiesPerDoc", 
              "$WinterActivitiesPerDoc", 
              "$FallActivitiesPerDoc"
          ]
      }
  }
},
{
  $group: { 
      "_id" : null, 
      "TotalActivities" : {
          "$sum" : "$TotalActivitiesPerDoc"
      }
  }
},
{
  $project: { 
      "_id" : 0, 
      "TotalSGPActivities" : "$TotalActivities"
  }
}
],
{
   cursor: {
     batchSize: 50
},

allowDiskUse: true
}
);