计算条目并存储为字段

时间:2017-05-03 11:55:27

标签: mongodb mongodb-query aggregation-framework

我的数据库中有以下结构,我需要为所有孩子计算“Tripduration”并将其保存在“Tripcount”下,因为我每次旅行的持续时间都有一个条目:

{
    "_id": 1,
    "Tripcount": "This should be 5",
    "Trips": [
        {
            "EndStationID": 2,
            "Tripduration": [
                43,
                50,
                45
            ]
        },
        {
            "EndStationID": 3,
            "Tripduration": [
                52
            ]
        },
        {
            "EndStationID": 4,
            "Tripduration": [
                34
            ]
        }

我有以下查询,但它总是返回0.我是MongoDB语法的新手,希望有人看到它返回0的原因:

db.test.aggregate( 
  { 
    $group: { 
      _id:   {"StationID": "$Start Station ID", "EndStationID": "$End Station ID"}, 
      durations: {$addToSet: "$Trip Duration" },
    } 
  }, 
  { 
    $group: {
      _id: "$_id.StationID",
      Tripcount: {$sum: "durations"},
      Trips: { $addToSet: { EndStationID: "$_id.EndStationID", Tripduration: "$durations"} } 
    } 
  } 
)

2 个答案:

答案 0 :(得分:2)

您可以使用聚合框架执行此操作。

您需要将$add表达式应用于“Tripduration”$size数组,并使用$reduce运算符组合该值。

当然要获得“Tripduration”大小的数组,你需要使用$map数组运算符

db.trip.aggregate(    
    [
       {
          "$addFields":{
             "Tripcount":{
                "$reduce":{
                   "input":{
                      "$map":{
                         "input":"$Trips",
                         "in":{
                            "$size":"$$this.Tripduration"
                         }
                      }
                   },
                   "initialValue":0,
                   "in":{
                      "$add":[
                         "$$value",
                         "$$this"
                      ]
                   }
                }
             }
          }
       }
    ]
)

在集合中保持更改持久,只需将$out管道添加到舞台

即可
{ "$out": "trip" }

但请注意,这会覆盖您的收藏或创建一个新的

答案 1 :(得分:1)

您可以使用$reduce连接数组,然后在3.4版本上使用$size

db.test.aggregate(
    [{
        $addFields: {
            "Tripcount": {
                $size: {
                    $reduce: {
                        input: "$Trips.Tripduration",
                        initialValue: [],
                        in: {
                            $concatArrays: ["$$value", "$$this"]
                        }
                    }
                }
            }
        }
    }]
)

参考:https://docs.mongodb.com/manual/reference/operator/aggregation/reduce/