在MongoDB中将字符串转换为日期

有没有办法使用mongodb shell使用自定义格式将字符串转换为日期

我正在尝试将“ 21 / May / 2012:16:35:33 -0400”转换为日期,

有没有办法传递DateFormatter某种东西 Date.parse(...)ISODate(....)方法?


qq_遁去的一_1
浏览 5935回答 3
3回答

慕后森

使用MongoDB 4.0及更高版本该$toDate运营商将值转换为日期。如果该值不能转换为日期,则$toDate错误。如果该值为null或缺少,则$toDate返回null:您可以在聚合管道中使用它,如下所示:db.collection.aggregate([ &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;"$addFields":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"created_at":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$toDate":&nbsp;"$created_at" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}])以上等效于使用$convert运算符,如下所示:db.collection.aggregate([ &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;"$addFields":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"created_at":&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$convert":&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"input":&nbsp;"$created_at",&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"to":&nbsp;"date"&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}])使用MongoDB 3.6及更高版本您还可以使用$dateFromString运算符将日期/时间字符串转换为日期对象,并具有用于指定日期格式和时区的选项:db.collection.aggregate([ &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;"$addFields":&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"created_at":&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$dateFromString":&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"dateString":&nbsp;"$created_at", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"format":&nbsp;"%m-%d-%Y"&nbsp;/*&nbsp;<--&nbsp;option&nbsp;available&nbsp;only&nbsp;in&nbsp;version&nbsp;4.0.&nbsp;and&nbsp;newer&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;}])使用MongoDB版本&nbsp;>= 2.6 and < 3.2如果MongoDB版本没有执行转换的本机运算符,则需要find()使用forEach()方法或游标方法next()来访问该文档,以手动迭代该方法返回的游标。通过循环,将字段转换为ISODate对象,然后使用$set运算符更新该字段,如下面的示例所示,其中该字段被调用created_at并且当前以字符串格式保存日期:var&nbsp;cursor&nbsp;=&nbsp;db.collection.find({"created_at":&nbsp;{"$exists":&nbsp;true,&nbsp;"$type":&nbsp;2&nbsp;}});&nbsp;while&nbsp;(cursor.hasNext())&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;doc&nbsp;=&nbsp;cursor.next();&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;db.collection.update( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"_id"&nbsp;:&nbsp;doc._id},&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"$set"&nbsp;:&nbsp;{"created_at"&nbsp;:&nbsp;new&nbsp;ISODate(doc.created_at)}} &nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;};为了提高性能(尤其是在处理大型集合时),请充分利用Bulk API进行批量更新,因为您将批量操作(例如1000)发送到服务器,这将为您带来更好的性能,因为您不会将每个请求都发送给服务器。服务器,每1000个请求中只有一次。下面演示了这种方法,第一个示例使用MongoDB版本中可用的Bulk API&nbsp;>= 2.6 and < 3.2。通过将created_at字段更改为日期字段来更新集合中的所有文档:var&nbsp;bulk&nbsp;=&nbsp;db.collection.initializeUnorderedBulkOp(), &nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;=&nbsp;0;db.collection.find({"created_at":&nbsp;{"$exists":&nbsp;true,&nbsp;"$type":&nbsp;2&nbsp;}}).forEach(function&nbsp;(doc)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newDate&nbsp;=&nbsp;new&nbsp;ISODate(doc.created_at); &nbsp;&nbsp;&nbsp;&nbsp;bulk.find({&nbsp;"_id":&nbsp;doc._id&nbsp;}).updateOne({&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$set":&nbsp;{&nbsp;"created_at":&nbsp;newDate} &nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;counter++; &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(counter&nbsp;%&nbsp;1000&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bulk.execute();&nbsp;//&nbsp;Execute&nbsp;per&nbsp;1000&nbsp;operations&nbsp;and&nbsp;re-initialize&nbsp;every&nbsp;1000&nbsp;update&nbsp;statements &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bulk&nbsp;=&nbsp;db.collection.initializeUnorderedBulkOp(); &nbsp;&nbsp;&nbsp;&nbsp;}})//&nbsp;Clean&nbsp;up&nbsp;remaining&nbsp;operations&nbsp;in&nbsp;queueif&nbsp;(counter&nbsp;%&nbsp;1000&nbsp;!=&nbsp;0)&nbsp;{&nbsp;bulk.execute();&nbsp;}使用MongoDB 3.2下一个示例适用于新的MongoDB版本3.2,此版本已弃用Bulk API并使用以下命令提供了一组较新的api&nbsp;bulkWrite():var&nbsp;bulkOps&nbsp;=&nbsp;[], &nbsp;&nbsp;&nbsp;&nbsp;cursor&nbsp;=&nbsp;db.collection.find({"created_at":&nbsp;{"$exists":&nbsp;true,&nbsp;"$type":&nbsp;2&nbsp;}});cursor.forEach(function&nbsp;(doc)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;newDate&nbsp;=&nbsp;new&nbsp;ISODate(doc.created_at); &nbsp;&nbsp;&nbsp;&nbsp;bulkOps.push(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"updateOne":&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"filter":&nbsp;{&nbsp;"_id":&nbsp;doc._id&nbsp;}&nbsp;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"update":&nbsp;{&nbsp;"$set":&nbsp;{&nbsp;"created_at":&nbsp;newDate&nbsp;}&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bulkOps.length&nbsp;===&nbsp;500)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.collection.bulkWrite(bulkOps); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bulkOps&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});if&nbsp;(bulkOps.length&nbsp;>&nbsp;0)&nbsp;db.collection.bulkWrite(bulkOps);

犯罪嫌疑人X

就我而言,以下解决方案已成功完成,该解决方案将ClockTime集合中的字段ClockInTime&nbsp;从字符串转换为Date类型:db.ClockTime.find().forEach(function(doc)&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;doc.ClockInTime=new&nbsp;Date(doc.ClockInTime); &nbsp;&nbsp;&nbsp;&nbsp;db.ClockTime.save(doc);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MongoDB