如何使用mongoimport从CSV文件导入Mongodb ObjectId?

vla*_*irp 10 mongodb

我正在努力使用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"})
Run Code Online (Sandbox Code Playgroud)

然后我在shell中使用了mongoexport命令:

mongoexport -h localhost:3002 -d yourdb -c classes --csv -f student_id,name > export.txt
Run Code Online (Sandbox Code Playgroud)

生成的CSV如下所示:

student_id,name
ObjectID(5143af326d44e1ceb372121d),"II-4"
Run Code Online (Sandbox Code Playgroud)

然后我使用以下方法导入生成的CSV:

mongoimport -h localhost:3002 -d yourdb -c class --type csv --file export.txt --headerline
Run Code Online (Sandbox Code Playgroud)

Quering类集合现在返回:

db.class.find()
{ "_id" : ObjectId("5143afc66d44e1ceb372121e"), "student_id" :   ObjectId("5143af326d44e1ceb372121d"), "name" : "II-4" }
{ "_id" : ObjectId("5143b44788df173ba096550e"), "student_id" : "ObjectID(5143af326d44e1ceb372121d)", "name" : "II-4" }
Run Code Online (Sandbox Code Playgroud)

您可以注意到第二个文档中的student_id字段实际上是一个字符串而不是MongoDB ObjectId.

我错了什么或者Mongo无法导入它自己导出的CSV?

小智 38

对于有这个问题的人试图从JSON插入ObjectIds - 对现有数据进行一些修改是非常可能的.

更换:

{ "_id" : ObjectId("5143afc66d44e1ceb372121e"),
  "student_id" : ObjectId("5143af326d44e1ceb372121d"),
  "name" : "II-4" }
Run Code Online (Sandbox Code Playgroud)

附:

{ "_id" : {"$oid":"5143afc66d44e1ceb372121e"},
  "student_id" : {"$oid":"5143af326d44e1ceb372121d"},
  "name" : "II-4" }
Run Code Online (Sandbox Code Playgroud)

只需使用正则表达式替换ObjectId换行.

  • 最佳答案!应该是绿色的! (6认同)
  • 是的,应该是绿色的! (2认同)

小智 4

该问题可以在 MongoDB 2.4.1 中重现。

\n\n

文档(http://docs.mongodb.org/manual/reference/mongoimport/)指出(我强调):

\n\n
\n

注意 不要将 mongoimport 和 mongoexport 用于完整实例、\n 生产备份,因为它们无法可靠地捕获数据类型\n 信息。使用 mongodump 和 mongorestore,如 \xe2\x80\x9cBackup\n MongoDB 系统策略\xe2\x80\x9d 中所述,以实现此类功能。

\n
\n\n

在此讨论中https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/RcnumM5QyxM回答了类似的问题,如下所示:

\n\n
\n

带有 tsv 或 csv 的 Mongoimport 只能导入 strings 和 numeric,而不能导入 [1] 中指定的任何其他类型。如果您确实想导入这些类型,并且可以为导入文件生成 JSON 而不是 TSV,那么这将是一个好方法;否则,您可以编写后处理步骤,将字符串转换为适当的 MongoDB 类型(基于给定字段的值类型的一些知识)。

\n\n
    \n
  • \n
\n\n

[1] http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON

\n
\n