39 votes

MongoDB - quel est le moyen le plus rapide de mettre à jour tous les enregistrements d'une collection?

J'ai une collection avec 9 millions de disques. J'utilise actuellement le script suivant pour mettre à jour l'ensemble de la collection:

simple_update.js

 db.mydata.find().forEach(function(data) {
  db.mydata.update({_id:data._id},{$set:{pid:(2571 - data.Y + (data.X * 2572))}});
});
 

Ceci est exécuté à partir de la ligne de commande comme suit:

 mongo my_test simple_update.js
 

Donc, tout ce que je fais est d'ajouter un nouveau pid de champ basé sur un calcul simple.

Y at-il un moyen plus rapide? Cela prend beaucoup de temps.

28voto

Gates VP Points 26481

Il y a deux choses que vous pouvez faire.

  1. Envoyer une mise à jour avec le "multi" indicateur a la valeur true.
  2. Magasin de la fonction de serveur-côté et essayez d'utiliser le code côté serveur d'exécution.

Ce lien contient également les conseils suivants:

C'est une bonne technique pour la réalisation des lots de travail administratif. Exécuter mongo sur le serveur, la connexion via l'interface localhost. La connexion est alors très rapide et à faible latence. C'est plus convivial que de db.eval() en db.eval() bloque les autres opérations.

C'est probablement la manière la plus rapide que vous allez obtenir. Vous vous rendez compte que la délivrance de 9M mises à jour sur un serveur unique va être une opération lourde. Disons que vous pourriez obtenir 3k mises à jour / seconde, vous êtes toujours en train de parler de course pendant près d'une heure.

Et ce n'est pas vraiment un "mongo problème", qui va être une limitation matérielle.

18voto

Telmo Dias Points 811

J'utilise la méthode : db.collection.update

 // db.collection.update( criteria, objNew, upsert, multi ) // --> for reference
db.collection.update( { "_id" : { $exists : true } }, objNew, upsert, true);
 

0voto

Gandalf Points 4909

Vous ne savez pas si ce sera plus rapide, mais vous pouvez effectuer plusieurs mises à jour. Dites simplement update where _id > 0 (ce sera le cas pour chaque objet), puis définissez le drapeau 'multi' sur true et il devrait en être de même sans avoir à parcourir la totalité de la collection.

Check this out: MongoDB - Exécution de code côté serveur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X