【问题标题】:How to subtract two dates in mongoDb aggregate inside $group?如何在 $group 内的 mongoDb 聚合中减去两个日期?
【发布时间】:2021-08-07 09:41:02
【问题描述】:

每当用户登录时,我都会尝试根据 mongoDB 中的数据计算用户的登录时间。我有登录 startDateTimeendDateTimeduration 字段,但如果持续时间为 0 则它应该采用当前日期时间和 startDateTime 的差异。

我在这里遇到的问题是结果错误,因为我已经通过使用new Date() 在浏览器控制台中减去相同的日期来检查。

这是我正在尝试的聚合查询

    let queryFilter = {
    createdAt: {
      "$gte": filter.from ? new Date(filter.from) : new Date(new Date().toDateString()),
      "$lte": filter.to ? new Date(filter.to) : new Date(new Date().toDateString())
    }
  }


AgentJournal.aggregate([
    {
      $match: queryFilter
    },
    {
      $group: {
        _id: { agent: "$agent", queue: "$queue", channel: "$channel" },
        loginTime: { "$sum": { "$cond": [{ "$eq": ["$event", "LOGIN"] }, { "$cond": [{ "$eq": ["$duration", 0] }, { $subtract: [new Date(), new Date("$startDateTime")] }, "$duration"] }, 0] } },
      }
    }
  ])

这是存储在我的数据库中的示例文档:

{
    "_id" : ObjectId("608a6ee3e781511b7283c393"),
    "duration" : 0,
    "agent" : "SIP/intellicon",
    "queue" : "sales",
    "event" : "LOGIN",
    "startDateTime" : "2021-04-29 13:27:21",  //String Type
    "endDateTime" : "0000-00-00 00:00:00",    //String Type
    "channel" : "fb_pages",
    "__v" : 0,
    "createdAt" : ISODate("2021-04-29T08:31:31.995Z"),
    "updatedAt" : ISODate("2021-04-29T08:31:31.995Z")
}

注意:我已经通过减去整数来检查它是否准确,所以我认为我的查询没问题

【问题讨论】:

    标签: javascript mongodb datetime mongoose logging


    【解决方案1】:

    尝试$toDate 运算符将您的字符串日期转换为日期类型,

    {
      $subtract: [
        new Date(),
        { $toDate: "$startDateTime" }
      ]
    }
    

    Playground

    【讨论】:

    • 谢谢@turivishal 的回答,但是为什么mongoDB calcuation 和new Date() - new Date("2021-04-29 13:27:21")的回答有区别@
    • 我们如何确定哪个答案是正确的
    • 您的本地和 mongodb 服务器中的时区发生变化..
    • nidejs 中的控制台new Date("2021-04-29 13:27:21").toISOString() 并查看此playground,比较两个日期..
    【解决方案2】:

    我已经通过使用@turivishal 告诉的$toDate 解决了这个问题,并首先将新日期转换为我的本地标准时间(即new Date().toLocaleString()),然后将其传递给$toDate(即{$toDate:new Date().toLocaleString}

    现在计算登录时间的查询是

    loginTime: { "$sum": { "$cond": [{ "$eq": ["$event", "LOGIN"] }, { "$cond": [{ "$eq": ["$duration", 0] }, { $subtract: [{ $toDate: new Date().toLocaleString() }, { $toDate: "$startDateTime" }] }, "$duration"] }, 0] } },

    再次感谢@turivishal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2020-10-06
      • 2022-01-21
      • 2012-06-07
      • 2015-02-12
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多