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

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

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

这些字段将导入到集合Object2

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

 # # 

Object2可以通过object_1_id访问object_1_id

 > o = Object2.first # > o1 = o.object_1 # 

但是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并且能够识别其父项。

由于每个mu太短的注释,ID被导入为Strings而不是BSON ObjectIds。

mongoexportmongoimport (我只使用后者)只支持字符串和数字(​​参见: https : mongoimport )。

要从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文件来自其他地方。