0

mongoimport を使用して csv ファイルをインポートしました。具体的には、このデータセット:

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
        }],

しかし、これにより空の配列が得られます。の型を に設定するとdescriptionString値は取得されますが、もちろん文字列として取得されるため、プロパティにはアクセスできません。

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

したがって、問題は、フィールドを にしたいときにフィールドdescriptionが であることのようです。StringArray

ここでの回答に従って、文字列から配列に変換しようとしましたが、うまくいきませんでした。

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が正しく解釈できるものはありますか?

4

1 に答える 1

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
}],

これで、インデックスを作成して GeoSpatial クエリで使用できるデータができました。

于 2015-07-19T22:58:26.827 に答える