mongodb 使用mongoimport导入日期数据类型

qvtsj1bj  于 2023-05-17  发布在  Go
关注(0)|答案(5)|浏览(217)

我有很多GB的数据存储在PostgreSQL数据库,我需要这些导入到MongoDB。我使用CSV导出和mongoimport完成了这一操作。
在CSV中有像'2011-06-25'这样的列,它被导入为字符串,而不是MongoDate,所以我不能有效地按日期搜索。
我发现了这个http://www.mongodb.org/display/DOCS/Import+Export+Tools#ImportExportTools-Example%3AImportingInterestingTypes但是这个例子说,我需要为文件使用JSON结构。我真的需要从PostgreSQL导出JSON文件吗?

如果我这样做-如何?
如果我没有,如何通过CSV导出“MongoDate”?

1hdlvixo

1hdlvixo1#

事实上,第一个选项即使在大数据的情况下也相当快。下面是一个使用mongo控制台的示例查询:

/usr/bin/mongo yourdbname --eval "db.yourcollectionname.find().forEach(function(doc){doc.yourdatefield = new ISODate(doc.yourdatefield);db.yourcollectionname.save(doc)});"
bqjvbblv

bqjvbblv2#

您的选择:

  • 导入CSV格式的内容,并在导入后将数据转换为Date()(使用mongo控制台或使用您最喜欢的语言编写的脚本)
  • 将数据导入为JSON,并使用$date描述符将日期字符串转换为Date示例
lx0bsm1f

lx0bsm1f3#

使用您最喜欢的语言编写一个脚本来导入数据。它将允许您控制数据类型并对数据应用结构更改。
通常,您会发现从表格数据转换到文档数据库时,数据的Map是不一样的。
如果您编写脚本,则可能还希望支持运行多个副本(或线程)以提高导入速度。

wnavrhmk

wnavrhmk4#

如果可能,从源CSV重新导入应该更快。对于一个相对较大的数据集(1.3亿个对象,源CSV约6 GB),mongoimport运行需要40分钟,但@ webDEVILpers建议的forEach需要24小时以上(此时我取消了它)。
要从CSV导入并转换日期,我运行

mongoimport --db your-db-name --type csv --file your-file.csv --collection your-collection --fields timestamp.date\(2006-01-02\ 15:04:0
5.00000+00\),count.int32\(\), --columnsHaveType

.date()部分很棘手,您必须**在源格式中指定特定日期。所以我的时间戳就像“2018-02-03 12:09:23.00000+00”,这意味着以该格式(如上面的命令)格式化引用日期(Jan 2nd,2006 15:04:05)。请参阅此处以供参考。

eanckbw9

eanckbw95#

我迟到了一点,但是上面的forEach版本可以通过使用bulkWrite而不是save来提高速度,并且每个文档的写入时间为0.25ms而不是1.2ms

  • 注意:我的数据需要清理字符串,但这对编写文档没有影响。*

没有bulkWrite,即save

mongo> i=0;
0
mongo> start= new Date();
ISODate("2023-05-15T07:20:30.231Z")
mongo> db.myCol.find().forEach( d => {
     if (typeof(d.timeslot)!="string"){ return; };
     d.timeslot= new ISODate(d.timeslot.replace(' UTC',''));
     db.myCol.save(d);
     i+= 1;
     if (i%1000==0) {
       end=new Date();
       diff= (end.valueOf()-start.valueOf());
       printjson({
         ms: diff,
         n: 1000,
         avg_ms: diff/1000
       });
       start=new Date();
     }
   });
{ "ms" : 12722, "n" : 1000, "avg_ms" : 12.722 }
{ "ms" : 1163, "n" : 1000, "avg_ms" : 1.163 }
{ "ms" : 1208, "n" : 1000, "avg_ms" : 1.208 }
{ "ms" : 1183, "n" : 1000, "avg_ms" : 1.183 }
{ "ms" : 1168, "n" : 1000, "avg_ms" : 1.168 }
:

bulkWrite

mongo> blk=[];
[ ]
mongo> start= new Date();
ISODate("2023-05-15T07:27:16.882Z")
mongo> db.myCol.find().forEach( d => {
     if (typeof(d.timeslot)!="string"){ return; };
     blk.push({ updateOne: { filter: {_id:d._id }, update: { $set: { timeslot: new ISODate(d.timeslot.replace(' UTC','')) } } } });
     if (blk.length > 0 && blk.length%1000==0) {
       res=db.myCol.bulkWrite(blk);
       end=new Date();
       diff= (end.valueOf()-start.valueOf());
       printjson({
         ms: diff,
         n: res.matchedCount,
         avg_ms: diff/res.matchedCount
       });
       start=new Date();
       blk=[];
     }
   });
mongo> db.myCol.bulkWrite(blk);
{ "ms" : 9745, "n" : 1000, "avg_ms" : 9.745 }
{ "ms" : 252, "n" : 1000, "avg_ms" : 0.252 }
{ "ms" : 231, "n" : 1000, "avg_ms" : 0.231 }
{ "ms" : 213, "n" : 1000, "avg_ms" : 0.213 }
{ "ms" : 209, "n" : 1000, "avg_ms" : 0.209 }
:

相关问题