2015-07-19 3 views
0

Я использовал mongoimport для импорта CSV-файла. Этот набор данные, чтобы быть конкретными:MongoDB: Преобразование типа поля из строки в массив

https://www.google.com/fusiontables/DataSource?docid=1d7Qps--r0i-E4drYQQzntSdXN8xJ4-6qk24CiMed#map:id=3

Проблемы я имею с description поля.

[{"landing_point_id":3522,"latlon":"51.898325,-8.472768","name":"Cork, Ireland"}] 

Я полагаю, что это массив объектов, поэтому я делаю модель мангуста для него, как это:

description: [{ 
    landing_point_id: Number, 
    latlon: String, 
    name: String 
     }], 

Но это дает мне пустой массив. Если я устанавливаю тип description в String, я получаю значения - но, конечно, как строку, поэтому свойства недоступны.

"description" : "[{\"landing_point_id\":8398,\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]" 

Таким образом, проблема, кажется, что поле description является String, когда я хотел бы, чтобы это было Array.

Следующие ответы здесь я попытался преобразовать из строки в массив, но не повезло.

db.cables.find().snapshot().forEach(function (el) { 
    el.description_array = [ el.description ]; 
    db.cables.save(el); 
}); 

Это просто обертывает строку в другом массиве.

"description_array" : [ "[{\"landing_point_id\":8398,│ col10: '', 
\"latlon\":\"52.207114,1.620294\",\"name\":\"Sizewell, United Kingdom\"}]" ] 

И то же самое для

el.description_array = new Array(el.description); 

Любые идеи, как решить эту проблему?

Что-то, что можно редактировать в файле csv перед импортом, чтобы сделать mongoimport интерпретировать его правильно?

ответ

0

Теперь «строка» должна быть «проанализирована» в действительную структуру данных. Кроме того, «latlong» будет бесполезен для вас как «самой струны» и в неправильном порядке для того, как MongoDB ожидает координаты.

Так мы фиксируем как:

var bulk = db.cables.initializeOrderedBulkOp(), 
    count = 0; 

db.cables.find({ "description": { "$type": 2 } }).forEach(function(doc) { 
    doc.description = JSON.parse(doc.description); 
    doc.description = doc.description.map(function(desc) { 
     desc.coordinates = desc.latlon.split(",").reverse().map(function(el) { 
      return parseFloat(el); 
     }); 
     delete desc.latlong; 
     return desc; 
    }); 

    bulk.find({ "_id": doc._id }).updateOne({ 
     "$set": { "description": doc.description } 
    }); 
    count++; 

    // Send batch one in 1000 
    if (count % 1000 == 0) { 
     bulk.execute(); 
     bulk = db.cables.initializeOrderedBulkOp(); 
    } 
}); 

// Clear any queued 
if (count % 1000 != 0) 
    bulk.execute(); 

Изменение мангуста схемы для этого:

"description": [{ 
    "landing_point_id": Number, 
    "coordinates": [], 
    "name": String 
}], 

И теперь у вас есть данные, которые вы можете использовать индекс и с геопространственных запросов.

+0

Большое спасибо! А также для помощи с координатами (была следующая вещь в моем списке исправлений). –