2015-12-29 334 views
0

我在我的MongoDB数据库中有这种格式的日期。将日期转换为MongoDB ISO日期

{ 
     "_id": ObjectId("5682e899f326d45c821d8b9b"), 
     "City": "Atlanta", 
     "Date": "12/5/02", 
     "Temp": 78.5, 
} 

我想将其转换为ISO日期,以便我可以在我的数据库中对日期进行排序。使用PyMongo或JavaScript进行更新命令的最佳方式是什么?

+0

是否想通过将Date更改为ISODate来更新文档? – styvane

+0

您需要阅读文档,添加日期对象,然后再保存它们 – Valijon

回答

-1

我想,你应该首先检索记录并使用循环来改变所有。然后你应该解析数据来构造一个Date对象来转换为mongo日期。

var value = "12/5/02"; 
var parts = value.split("/"); 
var dt = new Date("20"+parts[2], parseInt(parts[1])-1, parts[0]); 

如果您正在使用的NodeJS,检查this了。

编辑:我假设12 =日,5 =月。

+0

您是否根据提供的示例日期运行了代码?我不认为这是你所希望的那样 – Andy

+0

@安迪你为什么不觉得呢? – abeyaz

+0

因为当我运行它时会显示错误的日期。 – Andy

0

自从我上次使用Mongo后,Mongo已经发生了很大的变化,但据我所知,正如其他地方所建议的那样,您将不得不依次加载和更新每条记录。

你有两个问题。首先是你的日期格式不明确。您给出的示例日期将具有不同的值,具体取决于用于将其解析为日期的系统的区域设置。在美国,它是(我认为)12月5日在2002年。在大西洋的一边,虽然它将解析为2002年5月12日。娱乐时间。

假设你知道每个日期的intented格式,那么在节点可以使用moment.js使用于每个日期解析到一个固定的格式例如

let date = moment(document.Date, "D/M/YY"); 

,然后作为一个ISO日期输出

document.Date = date.toISOString(); 

,或者如果你是人为善,做非破坏性

document.ISODate = date.toISOString(); 

虽然现在你有两个日期后看...

0

您需要遍历整个结果集,并逐一更新文件,像这样:如果你想删除

var f = function(e) { 
    var arr = e['Date'].split("/"); 

    //assuming "Date" field was formatted as "YY/MM/DD" 
    var date_obj = new Date(arr[0], arr[1], arr[2]); 

    db.your_collection.update({_id: e['_id']}, {$set: {date_obj: date_obj}});  
} 


db.your_collection.find().forEach(f) 

您的旧字段,您可以运行以下内容:

db.your_collection.update({}, {$unset: {Date: 1}}, {multi:true}); 

但是,直到您确定您的日期转换正确后才这样做。

+0

使用批量操作可以使这种效率更高。 –

+0

@MarkusWMahlberg - 如果每个文档的更新'date_obj'值不同,Bulk操作将如何工作? –

+0

我的头顶2.6:'var bulk = db.c.initializeUnorderedBulkOp(); var f = function(e){... var d = ...; bulk.find(查询).update(upDoc);}; db.c.find(查询).forEach(F); bulk.execute()'。相应地为3.0 –