0

使用 mongoimport 工具通过 CSV 将包含以下行的 CSV 导入 mongodb:

object_1_id,field1,field2
52db7f026956b996a0000001,apples,oranges
52db7f026956b996a0000001,pears,plums

这些字段被导入到集合Object2中。

导入后,通过控制台确认行存在。

#<Object2 _id: 52e0713417bcabcb4d09ad12, _type: nil, field1: "apples", field2: "oranges", object_1_id: "52db7f026956b996a0000001">
#<Object2 _id: 52e0713517bcabcb4d09ad76, _type: nil, field1: "pears", field2: "plums", object_1_id: "52db7f026956b996a0000001">

Object2可以Object1通过以下方式访问object_1_id

> o = Object2.first
#<Object2 _id: 52e0713417bcabcb4d09ad12, _type: nil, field1: "apples", field2: "oranges", object_1_id: "52db7f026956b996a0000001">
> o1 = o.object_1
#<Object1 _id: "52db7f026956b996a0000001", other_fields: "text and stuff">

Object1看不到任何Object2使用 mongoimport 导入的行。它可以看到通过控制台或其他方式创建的所有行:

> o1.object_2s.count
10
> o1.object_2s.find("52e0713417bcabcb4d09ad12")
Mongoid::Errors::DocumentNotFound:
    Document not found for class Object2 with id(s) 52e0713417bcabcb4d09ad12.

TL;DRObject1似乎无法识别通过 mongoimport 导入的子模型,尽管子模型正确存储了父 ID 并能够识别其父模型。

4

1 回答 1

0

根据 mu is too short's comment,id 被导入为字符串而不是 BSON ObjectIds。

mongoexport并且mongoimport(我只使用后者)只支持字符串和数字(​​参见:https ://stackoverflow.com/a/15763908/943833 )。

为了从 CSV 导入具有类型的数据,您必须使用扩展 JSON 转储,如上述链接中所述。

快速而肮脏的解决方案:

1) 使用以下命令将要导入的集合导出为 JSON mongoexport

mongoexport -d database -c collection -o output.json

2) 抓取导出文件的第一行。它应该看起来像这样:

{ "_id" : { "$oid" : "52dfe0106956b9ee6e0016d8" }, "column2" : "oranges", "column1" : "apples", "object_1_id" : { "$oid" : "52dfe0106956b9ee6e0016d8" }, "updated_at" : { "$date" : 1390403600994 }, "created_at" : { "$date" : 1390403600994 } }

3) _id 字段以及您不想导入的任何其他字段。

4) 使用您选择的语言生成 JSON 文件,并使用 JSON 片段作为每行的模板。

5) 使用以下命令导入新的 JSON 文件mongoimport

mongoimport -d database -c collection --type json --file modified.json

这将比 CSV 更好地保留类型。我不确定它是否像 using 一样可靠mongodumpmongorestore但它们不是我的选择,因为我的 CSV 文件来自其他地方。

于 2014-01-23T03:35:43.700 回答