2016-12-29 1280 views
2

只是在练习我的MongoDB查询,而且我用一个字段数据类型打了一堵墙。MongoDB:将日期字符串(mm/dd/yyyy)转换为Unix时间戳

我目前使用Robomongo作为GUI访问生产数据库。

我的文档结构如下:

Robomongo Document Structure

是否有MongoDB的操作或方式/方法将date字段值转换,目前在mm/dd/yyyy格式,以Unix时间戳,所以我们可以进行过滤操作?

回答

0

您可以迭代所有项目并逐一更新,转换为Date。这里是你的日期将从mm/dd/yyyyISODate一个例子:

db.test.find().forEach(function(res){ 

     if (typeof(res.date)=="string"){ 
     var arr = res.date.split("/"); 
     res.date = new Date(arr[2], arr[0] - 1, arr[1]); 
     db.test.save(res) 
     } 
    } 
) 

对于Unix时间戳(米利斯从时代),你可以调用getTime()Date

db.test.find().forEach(function(res){ 

     if (typeof(res.date)=="string"){ 
     var arr = res.date.split("/"); 
     res.date = new Date(arr[2], arr[0] - 1, arr[1]).getTime(); 
     db.test.save(res) 
     } 
    } 
) 

注意,这些日期将被转换转换为UTC格式,因此您可能需要在进行转换之前临时更改您的时区

如果您想优化更新性能,您还可以使用bulk update

您也可以将您的日期转换为yyyy-mm-dd,这将保留排序(检查this post)。下面将分解你的日期字段为daymonthyear,设置日期字段使用新的格式,并在名为test2新的集合写输出:

db.test.aggregate([{ 
    $project: { 
     startTime: 1, 
     endTime: 1, 
     date: { 
      $let: { 
       vars: { 
        year: { $substr: ["$date", 6, 10] }, 
        month: { $substr: ["$date", 0, 2] }, 
        dayOfMonth: { $substr: ["$date", 3, 2] } 
       }, 
       in : { $concat: ["$$year", "-", "$$month", "-", "$$dayOfMonth"] } 
      } 
     } 
    } 
},{ 
    $out :"test2" 
}]) 
+0

感谢@BertrandMartel。这是非常有用的,但是我期望在MongoDB中保持这一点,因为这是聚合查询的一部分。如果这一切都可能,我正在寻求避免使用Javascript,PHP等来进行转换。是否有一个使用各种MongoDB运营商来实现这一目标的流程? –

+0

我已经更新了我的帖子一个办法,你的字符串日期格式转换为'YYYY-MM-dd'这是不是你在第一时间想要什么,但将保留排序比较'MM-DD-yyyy' –

相关问题