2016-04-26 3 views
1

Я хочу изменить свою коллекцию mongodb от 2d до 2dsphere. У меня есть эта структура в моих db.users:Создайте GeoJson из массива координат в той же коллекции Mongodb

{ 
    "_id" : "1c6930387123e960eecd65e8ade28488", 
    "interests" : [ 
    { 
     "_id" : ObjectId("56a8b2a72f2c2a4c0250e896"), 
     "coordinates" : [-3.6833, 40.4] 
    } 
    ], 
} 

Я хотел бы иметь что-то вроде этого:

{ 
    "_id" : "1c6930387123e960eecd65e8ade28488", 
    "interests" : [ 
    { 
     "_id" : ObjectId("56a8b2a72f2c2a4c0250e896"), 
     "loc":{ 
     "type":"Point", 
     "coordinates" : [-3.6833, 40.4] 
     } 
    } 
    ], 
} 

Я попытался это:

db.users.update({interests:{$elemMatch:{coordinates : { $exists: true } }}}, { $set: { 'interests.$.place':{"type":"Point", "coordinates":'interests.$.coordinates'} } }, { upsert: false, multi: false }); 

Очевидно, что он вставляет буквально «интересы». координаты

И попытался это в Node:

users.find({interests:{$elemMatch: 
    {coordinates : 
     { $exists: true } }}} , 
    {"interests.coordinates":1,"interests._id":1,"_id":0 }).forEach(function(doc){ 
     users.update({interests: 
      {$elemMatch: 
       {_id : doc.interests[0]['_id'] }}}, 
      { $set: { 'interests.$.loc':{"type":"Point", "coordinates":doc.interests[0]['coordinates']} } }, 
      { upsert: false, multi: false },function(err, numberAffected, rawResponse) { 
      var modified=numberAffected.result.nModified; 
      console.log(modified) 
     }); 
    }); 

Но координаты были вставлены со смешанными значениями.

Мысли?

Спасибо!

ответ

0

Я не тестировал этот кусок кода, но думаю, что это пролить свет на эту проблему.

users.find(
    {interests:{ $elemMatch: {coordinates : { $exists: true } }}}).forEach(function(doc){ 

     for(var c = 0; c < doc.interests.length; c++) { 

      var orig = doc.interests[c].coordinates; 
      doc.interests[c].loc: { type:"Point", coordinates: orig }; 
      //delete doc.interests[c].coordinates; 

     }; 

     users.update({ _id: doc._id }, doc); 
    }); 

Попробуйте перебрать все документы в вашей коллекции, модифицируя весь документ, а затем обновите его в одной строке.

Предупреждение. Если у вас есть огромное количество документов в вашей коллекции, которые соответствуют условию «найти», вы должны использовать разбиение на страницы (пропуск/ограничение), чтобы избежать проблем с производительностью и памятью при первой загрузке.

+0

Вы удивительны! Ваш код работает исправно! Только мне пришлось изменить этот «doc.interests.coordinates.length» на этот «doc.interests.length», и он отлично работает! Большое спасибо! –

+0

Спасибо! Я исправил эту ошибку ввода! – Findemor

Смежные вопросы