9

我已经以 csv 格式下载了大量数据。我正在使用 mongoimport 将数据输入 MongoDB 进行处理。如何将日期转换为 MongoDB 识别的日期格式?

带有标题的样本数据

Date, Open Price, High Price, Low Price, Last Traded Price , Close Price, Total Traded Quantity, Turnover (in Lakhs)
04-Apr-2014,901,912,889.5,896.75,892.85,207149,1867.08
03-Apr-2014,908,918,897.65,900,900.75,156260,1419.9
02-Apr-2014,916,921.85,898,900.7,900.75,175990,1591.97
4

3 回答 3

19

据我所知,没有办法做到这一点mongoimport

但这可以通过导入数据然后运行以下脚本来实现(请注意,在 Neil 的 Lunn 脚本中,使用月份的所有这些麻烦都没有意义,因为 mongo 可以通过这样做正确转换您的日期new Date('04-Apr-2014')):

db.collName.find().forEach(function(el){
    el.dateField = new Date(el.dateField);
    db.collName.save(el)
});

PS如果时区如此重要(我假设它不是,如果只有没有时间信息的日期),您可以在本地计算机上更改时区,然后运行查询。(感谢 Neil Lunn 对此的澄清)

于 2014-04-06T05:27:41.057 回答
7

从 Mongo 版本 3.4 开始,您可以使用--columnsHaveTypes选项指定字段的类型,同时使用 mongoimport 导入数据。 这是供参考的链接。

下面的示例 mongoimport 语法:

mongoimport --db XYZ --collection abc --type tsv --fields id.int32(),client_name.string(),app_name.auto(),date.date() --columnsHaveTypes --file "abc.tsv" --verbose
于 2017-03-29T06:19:55.930 回答
6

这里基本上有三个选项,就好像你可以直接使用 mongoimport 导入 CSV,它不知道如何从这种格式转换日期。

  1. 通过任何方式将您的 CSV 输入转换为 JSON 格式。对于您的日期值,您可以使用该工具将识别的扩展 JSON 语法形式。然后可以将生成的 JSON 传递给 mongoimport。

  2. 编写自己的程序,通过读取 CSV 输入并进行正确的转换来导入数据。

  3. 按原样导入 CSV 内容,然后使用您选择的语言直接在 MongoDB 集合中操作数据。

第三种选择的一种方法是循环结果并相应地更新日期:

var months = [
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
];

db.collection.find({ },{ "Date": 1 }).forEach(function(doc){

    var splitDate = doc.Date.split("-");

    var mval = months.indexOf( splitDate[1] );
    mval = ( mval < 10 ) ?  "0" + mval : mval

    var newDate = new Date( splitDate[2] + "-" + mval + "-" + splitDate[0] );

    db.collection.update(
        { _id: doc._id },
        { "$set": { "Date": newDate } }
    );

})

这将确保您的日期随后转换为正确的 BSON 日期格式,并具有与您预期的相同的匹配日期值。

当心“本地”时区转换,您将希望存储为 UTC 时间。

于 2014-04-06T05:23:45.960 回答