【问题标题】:mongodb import filename as additional field?mongodb 导入文件名作为附加字段?
【发布时间】:2015-04-05 13:43:46
【问题描述】:

我有大量 csv 文件我想加载到 MongoDB - 我想做的(用于测试和数据沿袭)是将记录来自的文件名加载为文档 - 我查看了 mongoimport 语法,但似乎无法在此处执行。

我想要的是一个 csv(即 users1.csv)文件,其中包含 用户名、姓名、电子邮件 1,约翰,john@example.com

这将被加载到一个集合中 _ID,USERID,NAME,EMAIL,SOURCEFILE XXXXXX,1,John, john@example.com,users1.csv

任何人都可以推荐实现此目标的哪些方法?

1 - 我考虑过运行一些预处理来在文件中创建源名称,但理想情况下我不想更改原始数据源。

2 - 我考虑过使用文件名更新数据集 - 这似乎是一个不错的选择,但需要在加载集之间进行(例如,在导入 users1.csv 之后和导入 users2.csv 之前)。

有没有人对这样做的优雅方式有任何建议?非常感谢任何人的意见。

【问题讨论】:

  • 您在使用 mongoimport 时遇到了什么问题?你试过了吗?
  • 我确实做了 mongoimport,没有收到任何错误,但在语法中看不到将当前文件名用作字段的选项...
  • mongoimport 无法为您添加文件名。您应该执行 1、2,或者使用 csv 库和驱动程序自己编写导入作业。

标签: mongodb csv data-import


【解决方案1】:

我不确定你为什么不能使用 mongo import ?

mongoimport -d databaseToUse -c Collection --type csv --ignoreBlanks --file users1.csv --headerline

--headerline 使用第一行作为字段名称,这应该导入文件没问题..

如果您愿意,可以稍后指定字段

--fields <field1[,field2]>, -f <field1[,field2] etc etc>

我已经测试过了,没有问题..

至于添加,您可以结合使用 updateOne 函数将文件名添加到记录中..

var bulk = dataBaseToUse.items.initializeUnorderedBulkOp();
bulk.find({name:someField}).update( { $set: { sourceFile: fileName } } );

也许是这样的?

从初始导入中,您可以使用 -f 字段参数在 1 中添加详细信息。

这样的东西会创建字段

mongoimport -d databaseToUse -c Collection --type csv --ignoreBlanks --file users1.csv -f "id, userID, name, email, sourceFile" 

然后您将需要在另一个 1 班轮中更新整个集合。

导入就是这样......而且只是导入工具。不是即时导入和编辑。

更新功能应该是这样的:

dataBaseToUse.Collection.update(
  {
     $set: { sourceFile: "users1.csv" }
  })

我需要测试这些 100% 以确保它可以工作! :)

【讨论】:

  • 我能够毫无问题地导入数据,但想不出一种方法可以自动处理一批文件并添加额外的文件名字段 - 将做 --fields
  • @mr_gooding 我已经更新了答案,现在我可以看到 2 个步骤。有一个$setOnInsert 可用,但我似乎无法将它应用于 mongoimport 方法! :(
  • 谢谢,这听起来像是这样做的方式 - 然后我可以调用一个包装脚本,该脚本调用 mongoimport 然后 mongo.exe 使用第二个更新命令来设置源文件。感谢您在这方面的帮助 - 我明天有机会尝试时会通知您。
  • 是否可以将“key”:“value”对添加为导入文件中没有的附加字段?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2011-12-27
  • 2013-05-20
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多