我正在努力使用mongoimport从CSV文件导入Mongodb的ObjectId:
我尝试了我能想到的每种组合和转义方法,但无法从CSV正确导入ObjectId。
首先,我尝试将从MongoDB导出的确切内容导入CSV。 我正在使用MongoDB 2.2.1。
我刚创建了两个集合,并在另一个文档中引用了一个文档的_id:
use yourdb
db.createCollection("student")
db.createCollection("class")
db.student.insert({"name":"Peter"})
db.student.find() returns { "_id" : ObjectId("5143af326d44e1ceb372121d"), "name" : "Peter" }
db.class.insert({"student_id": ObjectId("5143af326d44e1ceb372121d"),"name":"II-4"})
然后我在shell中使用了mongoexport命令:
mongoexport -h localhost:3002 -d yourdb -c classes --csv -f student_id,name > export.txt
生成的CSV如下所示:
student_id,name
ObjectID(5143af326d44e1ceb372121d),"II-4"
然后我使用:
导入生成的CSVmongoimport -h localhost:3002 -d yourdb -c class --type csv --file export.txt --headerline
Quering类集合现在返回:
db.class.find()
{ "_id" : ObjectId("5143afc66d44e1ceb372121e"), "student_id" : ObjectId("5143af326d44e1ceb372121d"), "name" : "II-4" }
{ "_id" : ObjectId("5143b44788df173ba096550e"), "student_id" : "ObjectID(5143af326d44e1ceb372121d)", "name" : "II-4" }
您可以注意到第二个文档中的student_id字段实际上是一个字符串而不是MongoDB ObjectId。
我错了什么或者Mongo无法导入它自己导出的CSV ??
答案 0 :(得分:34)
对于有此问题且试图从JSON插入ObjectIds的任何人 - 可以对现有数据进行一些修改。
替换:
{ "_id" : ObjectId("5143afc66d44e1ceb372121e"),
"student_id" : ObjectId("5143af326d44e1ceb372121d"),
"name" : "II-4" }
使用:
{ "_id" : {"$oid":"5143afc66d44e1ceb372121e"},
"student_id" : {"$oid":"5143af326d44e1ceb372121d"},
"name" : "II-4" }
只需使用正则表达式替换ObjectId换行。
答案 1 :(得分:3)
问题可以在MongoDB 2.4.1中重现。
文档(http://docs.mongodb.org/manual/reference/mongoimport/)声明(我强调):
注意不要将mongoimport和mongoexport用于完整实例, 生产备份,因为它们无法可靠地捕获数据类型 信息即可。使用mongodump和mongorestore,如“备份”中所述 MongoDB系统的策略“用于此类功能。
在此讨论https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/RcnumM5QyxM中,类似的问题得到了回答:
使用tsv或csv的Mongoimport 只能导入字符串和数字,以及 不是[1]中指定的任何其他类型。如果你想导入 这些类型,如果你可以为你的生产JSON而不是TSV 导入文件,这将是一个很好的方式;否则,你可以写 后处理步骤,将字符串转换为适当的字符串 MongoDB类型(基于对某些类型的值的了解) 给定的字段应该是)。
- 丹