与阵列的mongodb聚合

时间:2018-02-04 15:24:29

标签: mongodb aggregation-framework

我有这样的数据:

{
    "_id" : ObjectId("..."),
    "name" : "Entry 1",
    "time" : ISODate("2013-12-28T06:00:00.000Z"),
    "value" : 100
},
{
    "_id" : ObjectId("..."),
    "name" : "Entry 2",
    "time" : ISODate("2013-12-28T06:00:00.000Z"),
    "value" : 200
},
{
    "_id" : ObjectId("..."),
    "name" : "Entry 1",
    "time" : ISODate("2013-12-28T11:00:00.000Z"),
    "value" : 110
},
{
    "_id" : ObjectId("..."),
    "name" : "Entry 2",
    "time" : ISODate("2013-12-28T11:00:00.000Z"),
    "value" : 230
},
{
    "_id" : ObjectId("..."),
    "name" : "Entry 3",
    "time" : ISODate("2013-12-28T11:00:00.000Z"),
    "value" : 25
},
{
    "_id" : ObjectId("..."),
    "name" : "Entry 4",
    "time" : ISODate("2013-12-28T11:00:00.000Z"),
    "value" : 15
}

我需要按时间分组的结果,每个条目的百分比如此(按卷分组和#34;其他&#34;当时间段的条目超过两个,但不是必需的):< / p>

{
   "_id": ISODate("2013-12-28T11:00:00.000Z"),
   "entries": [
      {
         "name": "Entry 1",
         "percentage": 33.3
      },
      {
         "name": "Entry 2",
         "percentage": 66.6
      },

   ]
},
{
   "_id": ISODate("2013-12-28T06:00:00.000Z"),
   "entries": [
      {
         "name": "Entry 1",
         "percentage": 28.9
      },
      {
         "name": "Entry 2",
         "percentage": 60.5
      },
      {
         "name": "Others",
         "percentage": 10.5
      }
   ]
 }

所以请求我尝试:

db.collection.aggregate([
{
    "$addFields": {
        "full_datetime": {"$substr": ["$time", 0, 19]}
    }
},        
{
   "$group": {
       "_id": "$full_datetime",
       "value_sum": {"$sum": "$value"},
       "entries": {
           "$push": {
               "name": "$name",
               "percentage": { 
                  "$multiply": [{ 
                      "$divide": ["$value", {"$literal": "$value_sum" }] 
                  }, 100 ]
               }
           }
       }
   }
}
])

此请求无效,因为$value_sum中不存在$push。 请帮助我如何将此$value_sum发送到$push声明

1 个答案:

答案 0 :(得分:1)

您可以使用$map作为

再使用一个阶段来计算百分比
db.collection.aggregate([
  "$addFields": {
    "full_datetime": {
      "$substr": ["$time", 0, 19]
    }
  }
}, {
  "$group": {
    "_id": "$full_datetime",
    "value_sum": {
      "$sum": "$value"
    },
    "entries": {
      "$push": {
        "name": "$name",
        "value": "$value"
      }
    }
  }
}, {
  "$project": {
    "entriesNew": {
      "$map": {
        "input": "$entries",
        "as": "entry",
        "in": {
          "name": "$$entry.name",
          "percentage": {
            "$multiply": [{
              "$divide": ["$$entry.value", "$value_sum"]
            }, 100]
          }
        }
      }
    }
  }
}])

输出:

/* 1 */
{
    "_id" : "2013-12-28T11:00:00",
    "entries" : [ 
        {
            "name" : "Entry 1",
            "percentage" : 28.9473684210526
        }, 
        {
            "name" : "Entry 2",
            "percentage" : 60.5263157894737
        }, 
        {
            "name" : "Entry 3",
            "percentage" : 6.57894736842105
        }, 
        {
            "name" : "Entry 4",
            "percentage" : 3.94736842105263
        }
    ]
}

/* 2 */
{
    "_id" : "2013-12-28T06:00:00",
    "entries" : [ 
        {
            "name" : "Entry 1",
            "percentage" : 33.3333333333333
        }, 
        {
            "name" : "Entry 2",
            "percentage" : 66.6666666666667
        }
    ]
}