2017-04-10 98 views
1

我在MongoDB中拥有数千个对象。我有一个名为“Insert_Date”的字段,其字符串格式为:“DD-Month(eg.JUN)-YYYY hh:mm”。我想用蒙戈外壳 我已经试过这一个,但它显示错误“无效ISO日期”使用MongoDB中的Mongo Shell将字符串转换为日期或ISODate

db.collection.find().forEach(function(doc) { 
doc.Insert_Date=new ISODate(doc.Insert_Date); 
db.collection.save(doc); 
}) 

有另一种方式来转换可能使用正则表达式将其转换为日期或ISODate? 任何帮助将appriciated。

回答

0

以下是一种使用“01-JUN-2009 00:00”作为日期值的方法。

首先,解析出时间值:

db.dates.aggregate([ 
    { 
    $project : { 
     day: { $substr: [ "$Date_Time", 0, 2 ] }, 
     month: { $substr: [ "$Date_Time", 3, 3 ] }, 
     year: { $substr: [ "$Date_Time", 7, 4 ] }, 
     hour: { $substr: [ "$Date_Time", 12, 2 ] }, 
     minute: { $substr: [ "$Date_Time", 15, 2 ] } 
     } 
    }, 
    { $out : "dates" } 
]); 

然后,一个月MMM字符串转换为数字MM像你在注释中。 您将需要在3.4或更高版本使用switch语句:

db.dates.aggregate([ 
    { 
    $project: { 
     "day": "$day", 
     "year": "$year", 
     "hour": "$hour", 
     "minute": "$minute", 
     "month" : 
     { 
      $switch: { 
       branches: [ 
        { case: { $eq: [ "$month", "JAN" ] }, then: "01" }, 
        { case: { $eq: [ "$month", "FEB" ] }, then: "02" }, 
        { case: { $eq: [ "$month", "MAR" ] }, then: "03" }, 
        { case: { $eq: [ "$month", "APR" ] }, then: "04" }, 
        { case: { $eq: [ "$month", "MAY" ] }, then: "05" }, 
        { case: { $eq: [ "$month", "JUN" ] }, then: "06" }, 
        { case: { $eq: [ "$month", "JUL" ] }, then: "07" }, 
        { case: { $eq: [ "$month", "AUG" ] }, then: "08" }, 
        { case: { $eq: [ "$month", "SEP" ] }, then: "09" }, 
        { case: { $eq: [ "$month", "OCT" ] }, then: "10" }, 
        { case: { $eq: [ "$month", "NOV" ] }, then: "11" }, 
        { case: { $eq: [ "$month", "DEC" ] }, then: "12" } 
       ] 
      } 
     } 
     } 
    }, 
    { $out : "dates" } 
]); 

然后,您可以创建一个字符串的MongoDB将其解释为一个日期:

db.dates.find().forEach(function(doc) { 
    db.dates.update({_id: doc._id},{$set : {"Date_Time": doc.year + '-' + doc.month + '-' + doc.day + 'T' + doc.hour + ':' + doc.minute}}); 
}); 

最后一步是通过将字符串转换成日期()来构造一个ISODate:

db.dates.find().forEach(function(doc) { 
    doc.Date_Time=new Date(doc.Date_Time); 
    db.dates.save(doc); 
}) 
+0

我试过日期以及和它搞砸日期 –

+0

你能提供一个具体examp le价值?看看格式,你可能想用$ substr()建立Date()的参数。 –

+0

这是一个对象''Insert_Date':“01-JUN-2009 00:00”'带有字符串类型的字段中的一个我在考虑先将MMM转换为MM,或许它会认识到有效日期 –