使用mongoimport

时间:2017-06-19 04:43:58

标签: mongodb mongoimport

我一直在尝试使用mongoimport将csv数据导入mongodb。这个系列是这样的:

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

我尝试过的一种方法是创建2个csv文件 - 一个带有id&名称和其他id,孩子(如果id有两个孩子,那么它将有两行)。使用mongoimport将数据导入两个不同的集合,然后使用带有子数据的第二个集合中的foreach()更新集合数据。

请建议有没有其他方法来填充这个"孩子"数组直接来自CSV ??

3 个答案:

答案 0 :(得分:3)

对我来说,最简单的方法是弄清楚如何格式化" CSV"对于mongoimport,只需创建一个集合,然后在其上使用mongoexport即可查看CSV格式的外观。

所以从shell创建你的文档:

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的地方,所以只是" import"现在来测试一下:

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

重新进入shell并查看新集合中的文档:

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的集合中的任何内容,即" string"通过$type查询运算符。

然后我们取出字符串,将其拆分为数组并剥离其他字符,只留下您想要的值。

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

最终结果是原始通缉表格中的文件:

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

这就是我的"一步一步"如何计算您的CSV格式,导入它然后"转换"将数据转换为您需要的状态。

答案 1 :(得分:0)

更简单的方法是格式化您的 csv 文件

根据您的示例,列名称应如下所示

id name children.0 children.1

答案 2 :(得分:-2)

收集如下:

   {
       "_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来导入