2017-06-19 77 views
1

我一直在尝试使用mongoimport将csv数据导入到mongodb中。集合是这样的:使用mongoimport作为mongodb中的数组导入csv数据

{ 
id:"122234343", 
name: "name1", 
children: ["222334444","333344444"] 
} 

一种方法我试过是创造2个CSV文件 - 一个id为&名称和其他与ID,儿童(如果ID有两个孩子,然后将有两行)。使用mongoimport将数据导入两个不同的集合,然后在第二个包含子数据的集合中使用foreach()更新集合数据。

请提出是否有任何其他方式直接从CSV填充这个“儿童”数组?

回答

1

对我来说,最简单的方法来解决如何格式化您的“CSV”为mongoimport就是简单地创建一个集合,然后使用mongoexport来查看CSV格式应该是什么样子。

因此,从外壳创建文档:

db.newcol.insert({ 
    id:"122234343", 
    name: "name1", 
    children: ["222334444","333344444"] 
}) 

然后退出shell并运行mongoexport

mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv 

,它会显示你的输出:

id,name,children 
122234343,name1,"[""222334444"",""333344444""]" 

在哪里“数组”用“字符串”表示并使用引号""在他们的逃脱形式。

,现在是使用来自mongoimport一个很清楚的地方,所以只是“进口”现在测试:

mongoimport -d test -c newcol --headerline --type csv out.csv 

重新输入外壳,看到了新的集合中的文件(S):

db.newcol.findOne() 
{ 
     "_id" : ObjectId("59476924d6eb0b7d6ac37e02"), 
     "id" : 122234343, 
     "name" : "name1", 
     "children" : "[\"222334444\",\"333344444\"]" 
} 

所以一切都在那里,被列为“字符串”,而不是一个数组的孩子。但是,这是不是一个真正的问题,因为我们得到了数据的输入,现在它只是达到我们现在实际上是改造它:

var ops = []; 
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => { 
    var children = doc.children.split(',').map(e => e.replace(/"|\[|\]|\\/gm,'').toString()); 
    ops.push({ 
    "updateOne": { 
     "filter": { "_id": doc._id }, 
     "update": { "$set": { "children": children } } 
    } 
    }); 

    if (ops.length >= 1000) { 
    db.newcol.bulkWrite(ops); 
    ops = []; 
    }    
}); 

if (ops.length > 0) { 
    db.newcol.bulkWrite(ops); 
    ops = []; 
} 

所以这是要遍历任何被导入到具有BSON集合类型2,它是通过$type查询运算符“字符串”。

然后,我们将字符串拆分为一个数组,并剥离其他字符以仅保留所需的值。

使用.bulkWrite()您以有效的方式提交这些更新,而不是为每个请求编写每个文档。它们实际上是分批发送到服务器的。

最终的结果是在原来的文件要形式:

db.testcol.findOne() 
{ 
     "_id" : ObjectId("5947652ccb237bd6e4e902a5"), 
     "id" : "122234343", 
     "name" : "name1", 
     "children" : [ 
       "222334444", 
       "333344444" 
     ] 
} 

所以这是我的“分步实施”的你如何能制定出您的CSV格式,导入,然后“转”数据转换为您需要的状态。

+0

谢谢@Neil Lunn..this适合我。 –

1

集合是象下面这样:下面的命令

{ 
     "_id" : ObjectId("580100f4da893943d393e909"), 
     "username" : "crystal", 
     "likes" : [ "running", "pandas", "software development" ] 
    } 

为CSV到MongoDB的:

mongoimport --db users --type csv --headerline --file /opt/backups/contacts.csv 

其实MongoDB是是非关系数据库所以没必要创建两个CSV的导入

+0

感谢Vishal,但我们应该使用什么格式来保存CSV中的“喜欢”数据? –

+0

您可以根据您的要求保留任何类型的数据 –