2014-05-20 2 views
0

Ce code est destiné à apporter des modifications en masse à tous les documents d'une collection MongoDB. Cependant, il n'y a aucun changement aux documents de la collection après l'exécution de ce code. Qu'est-ce qui va pas avec ça?Pourquoi ces modifications de document MongoDB ne sont-elles pas enregistrées?

var mongoose = require('mongoose'), 
    async = require('async'), 
    Person = require('../../model/Person'); 

mongoose.connect('mongodb://localhost/people-questions'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 

Person.find(function (err, people) { 
    if (err) return console.error(err); 

    //download bio info 
    async.each(people, function(person, callback) { 
     person.birthdateYear = '01'; 
     person.save(); 
     callback(); 
    }); 

    mongoose.connection.close(); 
}); 

J'ai vérifié qu'il n'y a pas de changements en laissant une mongo cli instance ouverte dans le Terminal et en cours d'exécution db.people.find(); pour voir le champ n'est pas mis à jour à tous, et aussi des requêtes telles que db.people.find({ "_id" : ObjectId("5379e6e21fe1e8e2fc364d17")});, faisant référence à des ID spécifiques pour vérifier que mon code Javascript est en effet connecté à la bonne base de données et utilise la bonne collection (cet identifiant provient d'un script précédent utilisant des détails de connexion identiques pour imprimer les ID de document).

Aussi, j'utilise Mongoose. Le schéma Mongoose a été mis à jour pour inclure des champs supplémentaires comme birthdateYear après la création des documents originaux, mais à partir de la lecture googling et Mongo Docs que j'ai déjà effectuée, il semble que les modifications du schéma ne nécessitent aucun travail particulier. contre les documents avec le schéma mis à jour tout de suite (devrait pouvoir de toute façon).

Répondre

1

La raison pour laquelle les mises à jour ne sont pas conservées est que la connexion à MongoDB est fermée avant que les callbacks save() ont une chance de terminer. En assurant que tous les rappels save() sont terminés avant de fermer la connexion, les données sont sauvegardées.

0

person.save est une fonction async essayer quelque chose comme

person.save (function(err){ 
    if(err) console.log(err); 
    callback(); 
}); 
+0

Cela n'a pas résolu le problème. Le rappel pour save() est également facultatif. – Trindaz

Questions connexes