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。
mongoexport
和mongoimport
(我只使用后者)只支持字符串和数字(参见: 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更好地保留类型。 我不确定它是否像使用mongodump
和mongorestore
一样可靠,但它们不适合我,因为我的CSV文件来自其他地方。