Rails / Mongoid:在mongoimport之后,父对象无法识别has_many / belongs_to关系的子对象

时间:2014-01-23 01:59:55

标签: ruby-on-rails ruby mongodb mongoid mongoimport

使用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无法看到使用mongoimport导入的任何Object2行。它可以看到通过控制台或其他方式创建的所有行:

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

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

1 个答案:

答案 0 :(得分:0)

由于mu太短了注释,id被导入为Strings而不是BSON ObjectIds。

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

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

快速而肮脏的解决方案:

1)使用mongoexport导出要导入的集合作为JSON:

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)使用mongoimport导入新的JSON文件:

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

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