从对象id提取日期并在mongodb中将其导出为csv
我对mongodb很陌生。我正在尝试将数据从集合导出到csv文件。我已经做到了,效果很好。我有个问题。是否有方法将日期从ObjectId导出到新列。我知道我们可以使用ObjectId.getTimestamp()从ObjectId获取日期。我们有没有办法为mongoexport做同样的事情。下面是我用来导出数据的查询从对象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 --
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写了一个详细的答案。我来试试这个。再次感谢