当前位置: 首页 > 知识库问答 >
问题:

在聚合过程中从MongoDB ISODate中以秒为单位获取unix时间戳

微生雨泽
2023-03-14

我在寻找这一个,但我找不到任何有用的解决我的案件。我想要的是在聚合期间从MongoDB ISODate中以秒为单位获得unix时间戳。问题是我可以从等时日期中得到时间戳,但它是以毫秒为单位的。所以我需要删掉那些毫秒。我试过的是:

> db.data.aggregate([
    {$match: {dt:2}}, 
    {$project: {timestamp: {$concat: [{$substr: ["$md", 0, -1]}, '01', {$substr: ["$id", 0, -1]}]}}}
  ])

正如您所看到的,我正在尝试从'md'var中获取时间戳,并将该时间戳与'01'和'id'号连接起来。上面的代码给出:

{
    "_id" : ObjectId("52f8fc693890fc270d8b456b"),
    "timestamp" : "2014-02-10T16:20:56011141"
}

然后我用以下命令改进了该命令:

> db.data.aggregate([
    {$match: {dt:2}},
    {$project: {timestamp: {$concat: [{$substr: [{$subtract: ["$md", new Date('1970-01-01')]}, 0, -1]}, '01', {$substr: ["$id", 0, -1]}]}}}
  ])

现在我得到:

{
    "_id" : ObjectId("52f8fc693890fc270d8b456b"),
    "timestamp" : "1392049256000011141"
}

我真正需要的是1392049256011141,所以没有额外的3000。我尝试了$subtract:

> db.data.aggregate([
    {$match: {dt:2}}, 
    {$project: {timestamp: {$concat: [{$substr: [{$divide: [{$subtract: ["$md", new Date('1970-01-01')]}, 1000]}, 0, -1]}, '01', {$substr: ["$id", 0, -1]}]}}}
  ])
{
    "_id" : ObjectId("52f8fc693890fc270d8b456b"),
    "timestamp" : "1.39205e+009011141"
}

共有1个答案

唐兴发
2023-03-14

我不知道为什么您认为需要以秒为单位而不是毫秒为单位的值,因为通常这两种形式都是有效的,而且在大多数语言实现中,毫秒实际上是首选的。但一般说来,试图将其强制转换成字符串是错误的,通常您只需进行数学运算:

db.data.aggregate([
  { "$project": {
    "timestamp": {
      "$subtract": [
        { "$divide": [
            { "$subtract": [ "$md", new Date("1970-01-01") ] },
            1000
        ]},
        { "$mod": [
          { "$divide": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              1000
          ]},
          1
        ]}
      ]
    }
  }}
])

它以秒为单位返回一个纪元时间戳。基本上是从一个BSON date对象减去另一个BSON date对象时得出的结果是以毫秒为单位的时间间隔。使用初始纪元日期“1970-01-01”实际上会从当前日期值中提取毫秒值。$divide运算符实际上删除了毫秒部分,而$mod执行模运算以实现舍入。

实际上,您最好用本机语言为应用程序工作,因为所有的BSON日期都将以本机“date/datetime”类型返回,在这里您可以提取时间戳值。考虑一下shell中的JavaScript基础知识:

var date = new Date()
( date.valueOf() / 1000 ) - ( ( date.valueOf() / 1000 ) % 1 )
db.data.aggregate([
    { "$group": {
        "_id": {
          "$subtract": [
              { "$subtract": [ "$md", new Date("1970-01-01") ] },
              { "$mod": [
                  { "$subtract": [ "$md", new Date("1970-01-01") ] },
                  1000 * 60 * 60 * 24
              ]}
          ]
        },
        "count": { "$sum": 1 }
    }}
])

这种形式更典型的是发出一个四舍五入到一天的时间戳,并在这些间隔内聚合结果。

因此,将聚合框架用于提取时间戳似乎并不是最佳用法,或者实际上不应该将时间戳转换为秒而不是毫秒。在您的应用程序代码中,我认为您应该这样做,当然,除非您确实想要时间间隔的结果,在此可以应用如图所示的日期数学。

方法已经存在,但是除非您实际进行聚合,否则这将是应用程序性能最差的选项。代之以代码进行转换。

 类似资料:
  • 问题内容: 我有一些用Go编写的代码,我正在尝试更新这些代码以使用最新的每周构建。(它最后一次在r60下构建)。现在,一切正常,除了以下几位: 关于如何更新它以与当前Go实施一起使用的任何建议? 问题答案:

  • 问题内容: Linux中是否有shell命令来获取时间(以毫秒为单位)? 问题答案: 返回秒数+当前纳秒。 因此,这就是您所需要的。 例: 返回自纪元以来的秒数(如果有用)。

  • 有没有办法以秒为单位获取一天中的当前时间?请注意,我问的是一天中的时间,而不是UTC时间。 我想要的是一个介于0-86400(12:00AM-11:59PM)之间的值(以秒为单位)。我正在开发一个每天工作的应用程序,当一天结束时,时间(以秒为单位)应该会重新回到。 假设现在是。我应该得到 36,000 秒,如果我的时间是,我应该得到 61,200 秒。 PS:我不知道现在的时间。程序将使用函数自行

  • 问题内容: 我已经搜索了很多,但是找不到一个简单的方法来做到这一点: 以毫秒或微秒为单位。 我该如何实现? 问题答案: 该时间是由mysql监视应用程序计算的,而不是由mysql服务器完成的。这不是您可以通过编程(例如)进行检索的方法(这很好)。 您可以通过在应用程序中进行计时,在调用查询函数之前和之后占用系统时间来粗略地模拟它。希望与mysql部分相比,客户端的开销将最小。

  • Linux中是否有shell命令来获取以毫秒为单位的时间?

  • 问题内容: 首先,这是我在Java 1类中遇到的一个简单问题。这是一个静态时间,我已经将其设置为“今天”为8:49:12,因此我要弄清楚这代表了午夜之后的多秒,以及“午夜”之后的秒数。8小时49分钟12秒。现在是我的代码: 我的问题是,我如何获得的时候不知道 从 和 自 午夜。 因此,基本上输出是: 之后的空间是几秒钟。 谢谢,请解释原因,以及如何选择解决方法。我想学习:P 问题答案: 试试这个简