从对象 id 中提取日期并将其导出到 mongodb 中的 csv
Posted
技术标签:
【中文标题】从对象 id 中提取日期并将其导出到 mongodb 中的 csv【英文标题】:extract date from object id and export it to csv in mongodb 【发布时间】:2017-06-17 11:57:27 【问题描述】:我对 mongodb 很陌生。我正在尝试将数据从集合导出到 csv 文件。我已经做到了,而且效果很好。我有个问题 。有没有办法将日期从 ObjectId 导出到新列。我知道我们可以使用 ObjectId.getTimestamp() 从 ObjectId 获取日期。有没有办法我们可以为 mongoexport 做同样的事情。下面是我用来导出数据的查询
mongoexport --db MyDB --collection CollectionName --type=csv --fieldFile fieldsList.txt --out Data.csv
【问题讨论】:
不适用于mongoexport
。不过还有其他方法,比如你提到的。最好的mongoexport
可以是“查询”。不操纵。
【参考方案1】:
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
的“特殊”字段附加到列表末尾
循环这些字段并返回一个值数组 - 其中@time
从ObjectId
中的_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 编写库。而且它实际上并不比这里的列表难多少,尤其是考虑到所有“引用”考虑的图书馆。
【讨论】:
感谢您撰写详细的答案。我会试试这个。再次感谢以上是关于从对象 id 中提取日期并将其导出到 mongodb 中的 csv的主要内容,如果未能解决你的问题,请参考以下文章
仅从日期时间字段(mysql)中提取日期并将其分配给 php 变量
NodeJS:从 JSON 中提取数据,修改对象并将其发送回同一个 JSON 文件