从对象id中提取日期并将其导出到mongodb中的csv

时间:2017-06-17 11:57:28

标签: mongodb mongodb-query mongoexport

我对mongodb很新。我试图将数据从集合导出到csv文件。我做到了,它工作正常。我有个问题 。有没有办法将日期从ObjectId导出到新列。我知道我们可以使用ObjectId.getTimestamp()从ObjectId获取日期。有没有办法我们可以为mongoexport做同样的事情。以下是我用来导出数据的查询

mongoexport --db MyDB --collection CollectionName --type=csv --fieldFile fieldsList.txt --out Data.csv

1 个答案:

答案 0 :(得分:2)

您无法使用mongoexport执行此操作,但如果案例通常很简单,那么您可以真正使用mongo shell。

例如,只需从具有扁平结构的集合中的所有字段导出数据,并将最后一个字段附加为时间戳,然后就可以执行以下操作:

mongo localhost/MyDB --quiet --eval 'db.CollectioName.find().forEach(d => print(Object.keys(d).concat(["@time"]).map(k => (k === "@time") ? d["_id"].getTimestamp().valueOf() : d[k].valueOf() ).join(", ")))' > Data.csv

将脚本部分显示为漂亮:

db.CollectioName.find().forEach(d =>
  print(Object.keys(d).concat(["@time"]).map(k => 
    (k === "@time") ? d["_id"].getTimestamp().valueOf() : d[k].valueOf() ).join(", ")
  )
)

基本上说,在迭代给定集合的所有文档时,我们

  • 获取所有文档字段的列表
  • 附加"特殊" @time到列表末尾的字段
  • 循环这些字段并返回一组值 - @timeObjectId中的_id获取时间戳
  • 用逗号连接结果数组并打印出所有内容

如果你有一个字段列表,那么你可以简单地用一个字段名称数组替换Object.keys(d)部分,例如:

db.CollectioName.find().forEach(d =>
  print(["_id","field1","field2"].concat(["@time"]).map(k => 
    (k === "@time") ? d["_id"].getTimestamp().valueOf() : d[k].valueOf() ).join(", ")
  )
)

但实际上,只要您提供数据库连接到脚本行的--quiet--eval选项,那么您只需将输出重定向到目标文件,从任何脚本编写想。

不考虑CSV的所有注意事项。但它是一个"快速和肮脏的" 解决方案,适用于大多数基本情况,或者至少是扩展的起点,而无需编写完整的程序列表。

如果您真的想要更多,那么您可以选择适合自己语言的驱动程序,以及为这些语言中的每一种语言提供过多的CSV写入库。它实际上并没有比这里的列表更难,特别是图书馆采取所有"引用"考虑因素。