2014-01-23 2 views
0

CSV, содержащий следующие строки импортируется в MongoDB с помощью CSV с помощью инструмента mongoimport:Рельсы/Mongoid: Объект Родитель не признает ребенка has_many/belongs_to связи после того, как mongoimport

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; DR Object1 не появляется распознавать дочерние модели, импортированные через mongoimport, несмотря на ребенок правильно хранить родительский ID и возможность для идентификации своего родителя.

+1

Возможно, ваш импорт испортил типы? Обратите внимание, что идентификаторы Object1 отображаются в кавычках (предполагая, что они являются строками), тогда как идентификатор Object2 отображается без кавычек (предполагая, что это объект BSON ObjectId). Проверьте из оболочки MongoDB и посмотрите, получаете ли вы «52db7f026956b996a0000001» или 'ObjectId (« 52db7f026956b996a0000001 »)'. –

ответ

0

В соответствии с комментарием mu слишком короткий комментарий ids импортировались как строки вместо 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 способен. Я не уверен, насколько он надежный, используя mongodump и mongorestore, но они не являются вариантом для меня, так как мой CSV-файл поступает из других источников.