使用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并且能够识别其父项。
答案 0 :(得分:0)
由于mu太短了注释,id被导入为Strings而不是BSON ObjectIds。
mongoexport
和mongoimport
(我只使用后者)只支持字符串和数字(参见: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更好地保留类型。我不确定它是否像使用mongodump
和mongorestore
一样可靠,但它们不适合我,因为我的CSV文件来自其他地方。