2015-02-05 26 views
2

我有很多csv文件想加载到MongoDB中 - 我想要做的(对于测试和数据沿袭)是加载文件的文件名中,记录来自文档中的附加字段 - 我已经看过mongoimport语法,但它似乎不可能在那里做到。mongodb导入文件名作为附加字段?

什么,我想是从CSV(即users1.csv)文件,其中包含 USERID,姓名,电子邮件 1,约翰,[email protected]

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

什么方法可以达到这个目标?

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

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

有没有人有任何建议,这样做的优雅方式?希望任何人输入。

+0

你用mongoimport遇到了什么问题?你尝试过吗? – Pogrindis 2015-02-05 15:59:18

+0

我做了mongoimport,没有得到任何错误,但是看不到语法中使用当前文件名作为字段的选项... – 2015-02-05 16:22:25

+0

mongoimport无法为您添加文件名。您应该执行1,2,或使用csv库和驱动程序自行编写导入作业。 – wdberkeley 2015-02-05 18:18:47

回答

0

我不知道你为什么不能使用mongo导入?

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" 

从那里,你将需要更新整个收集在另一个班轮。

导入只是..和导入工具而已。不是即时导入和编辑。

更新功能将沿着这些路线的东西:

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

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

+1

我能够毫无问题地导入数据,但想不到一种自动化一批文件的过程并添加额外的文件名字段的方法 - 将执行--fields 2015-02-05 16:20:22

+0

@mr_gooding我已经更新了答案,现在似乎有2个步骤,我可以看到。有'$ setOnInsert'可用,但我似乎不能将它应用于mongoimport方法! :( – Pogrindis 2015-02-05 16:36:55

+0

谢谢,这听起来像做到这一点 - 然后我可以调用一个包装脚本,它调用了mongoimport,然后使用第二个更新命令mongo.exe来设置源文件。感谢你的帮助 - 会让你知道什么时候我明天有机会尝试这个。 – 2015-02-05 16:40:36