【问题标题】:Get Days Between 2 MongoDB ISODates [duplicate]获取 2 个 MongoDB ISODates 之间的天数 [重复]
【发布时间】:2019-10-21 20:34:04
【问题描述】:

我正在尝试获取 2 个 ISODates 之间的天数差异并将其放在天数字段中。我有以下这些文件:

{
    created_at: ISODate("2019-06-06TT00:00:00Z"),
    completed_at: "2019-06-08"
},
{
    created_at: ISODate("2019-06-06TT00:00:00Z"),
    completed_at: null
},
{
    created_at: ISODate("2019-06-06TT00:00:00Z"),
    completed_at: "2019-06-04"
}

到目前为止,我尝试的是获取毫秒数。但我不想那样。我只想减去日期并得到天数的差异。

db.collection.aggregate([
            {
                $addFields: {
                    completed_at: {
                        $ifNull: [
                            {
                                "$dateFromString": {
                                    "dateString": "$completed_at"
                                }
                            },
                            new ISODate()
                        ]
                    }
                }
            },
            {
                $addFields: {
                    days: {
                        $cond: [
                            {"$lte": ["$completed_at", "$created_at"]},
                            0,
                            {
                                $divide: [
                                  {
                                    $subtract: [
                                        "$completed_at",
                                        "$created_at"
                                    ]
                                  },
                                    86400000
                                ]
                            }
                        ]
                    }
                }
            },
            {
                $project: {
                    _id: 0,
                    created_at: 1,
                    completed_at: 1,
                    days: 1
                }
            }
        ])

如果completed_at 字段是null,那么它的值应该是当前日期。如果completed_at 小于created_at,则days 为0。假设当前日期为2019 年6 月6 日,所需结果应为:

{
    days: 2
},
{
    days: 0
},
{
    days: 0
}

【问题讨论】:

  • “我只想减去日期并得到天数的差异”是什么意思。能详细解释一下吗?
  • 我想得到 2 个日期之间的差异,不考虑时间。
  • 你得到的正是上面的查询,对吗?
  • 假设我的 created_at 是今天下午 12 点,而我的 completed_at 是昨天,没有指定时间。结果应该是 1 但我上面的汇总结果就像 0.1234 一样。所以我必须删除日期中的时间才能得到我想要的输出。

标签: mongodb aggregation-framework


【解决方案1】:

我想我能够得到它。我删除了日期字段中的时间,并且我想要的结果正确显示。请让我知道我是否正确理解或需要进行一些调整以使其更快。谢谢!

db.collection.aggregate([
  {
    $addFields: {
      created_at: {
        $dateFromParts: {
          "year": {
            $year: "$created_at"
          },
          "month": {
            $month: "$created_at"
          },
          "day": {
            $dayOfMonth: "$created_at"
          }
        }
      },
      completed_at: {
        $ifNull: [
          {
            "$dateFromString": {
              "dateString": "$completed_at"
            }
          },
          {
            $dateFromParts: {
              "year": {
                $year: new Date()
              },
              "month": {
                $month: new Date()
              },
              "day": {
                $dayOfMonth: new Date()
              }
            }
          }
        ]
      }
    }
  },
  {
    $addFields: {
      days: {
        $cond: [
          {
            "$lte": [
              "$completed_at",
              "$created_at"
            ]
          },
          0,
          {
            $divide: [
              {
                $subtract: [
                  "$completed_at",
                  "$created_at"
                ]
              },
              86400000
            ]
          }
        ]
      }
    }
  },
  {
    $project: {
      _id: 0,
      created_at: 1,
      completed_at: 1,
      days: 1
    }
  }
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2021-01-25
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多