2012-07-31 9 views
1

Actuellement, j'ai mon lat/long dans des champs séparés dans ma base de données MongoDB, mais si je veux faire la recherche géospatiale je dois les avoir dans ce format:Mise à jour le document MongoDB pour géospatiale recherche

{ location : [ 50 , 30 ] } 

Par Quels moyens puis-je transposer les valeurs de mes clés lat/long en une nouvelle clé par document comme indiqué ci-dessus?

TIA!

+1

Lire l'ancien document, retourner les valeurs, écrire le résultat. Ne perdez pas de vue ceux que vous avez mis à jour. Est-ce que je manque quelque chose? –

+0

Oui, c'est vrai. Je me demandais comment. Ce post semble le couvrir: http://stackoverflow.com/questions/3788256/mongodb-updating-documents-using-data-from-the-same-document/3792958#3792958 – occasl

Répondre

1

Vous devrez parcourir tous vos documents qui n'ont pas de champ location et l'ajouter (en supprimant vraisemblablement les champs lat/long à moins que cela ne casse votre application).

db.mycollection.find({ location : { $exists : false } }).forEach(
    function (doc) { 
     // Add (lon, lat) pairs .. order is important 
     doc.location = { lon: doc.lon, lat: doc.lat }; 

     // Remove old properties 
     delete doc.lon; 
     delete doc.lat; 

     // Save the updated document 
     db.mycollection.save(doc); 
    } 
) 

Notez que l'ordre pour MongoDB geospatial indexing doit être cohérent dans votre document (longitude, latitude).

+0

Bien sûr, il est en train de transposer ... ce qui serait vous l'appelez ?? Je veux changer la forme des données et non les valeurs réelles (c'est-à-dire, transformer). Je sais comment trouver les docs, mais je ne suis pas sûr du mécanisme pour itérer ... est-ce que cette fonction de réduction de carte ou autre chose? – occasl

+0

@occasl: vous avez raison, la transposition est un terme approprié .. J'ai déduit quelque chose d'autre. Mappez/réduisez les copies dans une nouvelle collection de sortie, donc si vous voulez itérer en place un forEach est approprié. Révisé l'exemple pour inclure une mise à jour. – Stennie

+0

Merci ... c'est ce que j'ai fini par faire. – occasl

Questions connexes