2011-08-09 2 views
5

document est ceComment changer de champ ou mettre à jour rapidement dans MongoDB?

{title:"here", lat:123.4512, lng:36.3423, time:"2011-01-02"} 

je veux Chane document comme celui-ci

{title:"here", {latlng: {lat:123.4512, lng:36.3423}}, time:"2011-01-02"} 

donc je vais essayer par console MongoDB.

db.coll.find().forEach(function(u){ 
    u.latlng = {"lat":u.lat, "lng":u.lng}; 
    db.coll.save(u); 
    db.coll.update(u, {$unset:{"map_x1":1, "map_y1":1}}); 
}) 

mais il est très lent T.T

Je pense qu'une autre solution

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

mais je ne peux pas l'exécuter. parce que la première solution fonctionne toujours ....

Avez-vous une solution rapide comme ce travail?

Répondre

10

Votre deuxième requête est cassé car il va remplacer le document entier, utilisez $ set:

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {$set:{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

Ce sera au moins deux fois plus vite que votre tentative originale car il vous mettez à jour la même document deux fois, ce qui n'est pas nécessaire.

+0

Comment mongo gère-t-il ces commandes? Je suppose qu'il fait une sorte d'évaluation paresseuse et met à jour les documents dans un balayage de la collection? Ou faut-il chercher à nouveau le document et le mettre à jour? La seconde méthode nécessiterait une complexité de 0 (n^2) pour mettre à jour toute la collection, donc j'espère que ce n'est pas ce qui se passe. Mais existe-t-il une documentation officielle à ce sujet? – Savvas

Questions connexes