从数组到数组 MongoDB 减去时间

问题描述 投票:0回答:1

我有这样的数据

"delivery": [{
        "status": "Not Started",
        "createdAt": {
            "$date": "2020-12-21T03:50:33.877Z"
        },
        "updatedAt": {
            "$date": "2020-12-21T03:50:33.877Z"
        }
    }, {
        "status": "Accepted",
        "updatedAt": {
            "$date": "2020-12-21T03:51:20.915Z"
        },
        "createdAt": {
            "$date": "2020-12-21T03:51:20.915Z"
        }
    }, {
        "status": "Ongoing",
        "updatedAt": {
            "$date": "2020-12-21T03:52:40.087Z"
        },
        "createdAt": {
            "$date": "2020-12-21T03:52:40.087Z"
        }
    }, {
        "status": "Ended",
        "updatedAt": {
            "$date": "2020-12-21T03:52:40.087Z"
        },
        "createdAt": {
            "$date": "2020-12-21T04:00:40.087Z"
        }

我想获取从Not StartedAccepted以及从OngoingEnded的时间差。我遇到错误cant $subtract aarray from a array我希望得到两个不同数组之间的差异。

db.deliveries.aggregate([
    { 
        $project: 
        { 
            "delivery.createdAt": 1,
            "delivery.updatedAt": 1
        } 
    },
    { 
        $addFields: {
            difference: {
                $divide: [{$subtract: ["$delivery.updatedAt", "$delivery.createdAt"]}, 3600000]
            }
        }       
    },
])

预期输出:

{
    "status": "Not Started",
    "createdAt": {
        "$date": "2020-12-21T03:50:33.877Z"
   },
   "updatedAt": {
        "$date": "2020-12-21T03:50:33.877Z"
    }
}, {
    "status": "Accepted",
    "updatedAt": {
        "$date": "2020-12-21T03:51:20.915Z"
    },
    "createdAt": {
        "$date": "2020-12-21T03:51:20.915Z"
    }
},
difference: 0.013066111111111112



{
    "status": "Ongoing",
    "updatedAt": {
        "$date": "2020-12-21T03:52:40.087Z"
    },
    "createdAt": {
        "$date": "2020-12-21T03:52:40.087Z"
    }
}, {
    "status": "Ended",
    "updatedAt": {
        "$date": "2020-12-21T03:52:40.087Z"
    },
    "createdAt": {
        "$date": "2020-12-21T04:00:40.087Z"
    },
 difference: 0.08 //sample computation

我想计算从 Not Started(createdAt) 到 Accepted(updatedAt) 的差异。并获得从 **Ongoing(createdAt) 到 Ended(updatedAt) 的差异。

mongodb mongodb-query aggregation-framework
1个回答
1
投票

您可以通过 $addFields 和 $cond 来找出开始和结束时间。然后计算差异,

db.collection.aggregate([
  {
    "$addFields": {
      "start": {
        "$reduce": {
          "input": "$delivery",
          "initialValue": null,
          "in": {
            "$cond": {
              "if": {
                $eq: [
                  "$$this.status",
                  "Not Started"
                ]
              },
              "then": "$$this.createdAt",
              "else": "$$value"
            }
          }
        }
      },
      "end": {
        "$reduce": {
          "input": "$delivery",
          "initialValue": null,
          "in": {
            "$cond": {
              "if": {
                $eq: [
                  "$$this.status",
                  "Accepted"
                ]
              },
              "then": "$$this.updatedAt",
              "else": "$$value"
            }
          }
        }
      }
    }
  },
  {
    "$addFields": {
      "difference": {
        "$divide": [
          {
            "$subtract": [
              "$end",
              "$start"
            ]
          },
          3600000
        ]
      }
    }
  }
])

这里是Mongo Playground供您参考。

© www.soinside.com 2019 - 2024. All rights reserved.