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

从对象id提取日期并在mongodb中将其导出为csv,mongodb,mongodb-query,mongoexport,Mongodb,Mongodb Query,Mongoexport,我对mongodb很陌生。我正在尝试将数据从集合导出到csv文件。我已经做到了,效果很好。我有个问题。是否有方法将日期从ObjectId导出到新列。我知道我们可以使用ObjectId.getTimestamp()从ObjectId获取日期。我们有没有办法为mongoexport做同样的事情。下面是我用来导出数据的查询 mongoexport --db MyDB --collection CollectionName --type=csv --fieldFile fieldsList.txt --

我对mongodb很陌生。我正在尝试将数据从集合导出到csv文件。我已经做到了,效果很好。我有个问题。是否有方法将日期从ObjectId导出到新列。我知道我们可以使用ObjectId.getTimestamp()从ObjectId获取日期。我们有没有办法为mongoexport做同样的事情。下面是我用来导出数据的查询

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

您无法使用
mongoexport
实现这一点,但是如果案例通常足够简单,那么您就可以使用mongoshell

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

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
    的“特殊”字段附加到列表的末尾
  • 循环这些字段并返回一个值数组,其中
    @time
    \u id
    中的
    ObjectId
    获取时间戳
  • 用逗号连接结果数组并将其全部打印出来
如果您有一个字段列表,那么只需将
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(", ")
  )
)
但实际上,只要您提供要连接的数据库以及脚本行的和选项,就可以将输出重定向到目标文件,从您想要的任何脚本

它没有考虑CSV的所有考虑因素。但它是一个“快速而肮脏”的解决方案,适用于最基本的紧急情况,或者至少是在不编写完整程序清单的情况下进行扩展的起点


如果您真的想要更多,那么您所选择的语言都有驱动程序,而且每种语言都有大量的CSV编写库。而且它实际上并不比这里的列表难多少,尤其是考虑到所有“引用”因素的库。

您不能使用
mongoexport
来实现这一点,但是如果案例通常足够简单,那么您可以使用mongoshell

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

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
    的“特殊”字段附加到列表的末尾
  • 循环这些字段并返回一个值数组,其中
    @time
    \u id
    中的
    ObjectId
    获取时间戳
  • 用逗号连接结果数组并将其全部打印出来
如果您有一个字段列表,那么只需将
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(", ")
  )
)
但实际上,只要您提供要连接的数据库以及脚本行的和选项,就可以将输出重定向到目标文件,从您想要的任何脚本

它没有考虑CSV的所有考虑因素。但它是一个“快速而肮脏”的解决方案,适用于最基本的紧急情况,或者至少是在不编写完整程序清单的情况下进行扩展的起点


如果您真的想要更多,那么您所选择的语言都有驱动程序,而且每种语言都有大量的CSV编写库。而且它实际上并不比这里的列表难多少,特别是考虑到所有“引用”因素的库。

而不是
mongoexport
。还有其他的方法,比如你提到的。最好的
mongoexport
can-to是“查询”。不能操纵。不能使用
mongoexport
。还有其他的方法,比如你提到的。最好的
mongoexport
can-to是“查询”。不,谢谢你写了一个详细的答案。我来试试这个。再次感谢Hanks写了一个详细的答案。我来试试这个。再次感谢