2016-04-11 9 views
0

Ich habe App, wo ich versuche zu überprüfen, ob ein Dokument mit der Benutzer-ID bereits vorhanden ist, dann aktualisieren Sie das vorhandene mit den Daten gesendet Wenn die Anfrage nicht existiert, erstellen Sie ein neues Dokument.Überprüfen Sie, ob das Dokument bereits existiert und wenn ja, dann aktualisieren Sie, neu erstellen - Mongoose

Ich habe dies bisher getan:

Bio.findOne({userID: req.body.userID}, function(err, bio) { 
     if (err) { 
      console.log("The error while updating colleciton is " + err); 
     } 
     // if already exists then update it 
     if (bio) { 
      console.log("Bio document for user already exists!"); 
      bio.userBios = { 
       $push: { 
        background: req.body.userBios.background, 
        experience: req.body.userBios.experience, 
        skills: req.body.userBios.skills, 
        bioForSector: req.body.userBios.bioForSector 
       } 
      } 
      bio.save(function(err) { 
       if (err) 
        throw err 
       return (null, bio) 
      }) 
     } 
     //if does not exist then create new 
     if (!bio) { 
      console.log("Bio document for user does NOT exist! creating new"); 
      var bio = new Bio(); 

      bio.firstName = req.body.firstName; 
      bio.lastName = req.body.lastName; 
      bio.jobTitle = req.body.jobTitle; 
      bio.userID = req.body.userID; 
      bio.userBios = { 
       background: req.body.userBios.background, 
       experience: req.body.userBios.experience, 
       skills: req.body.userBios.skills, 
       bioForSector: req.body.userBios.bioForSector 
      }; 

      // save the bio 
      bio.save(function(err) { 
       if (err) 
        throw err; 
       return (null, bio); 
      }); 
     } 
    }); 

Die Frage:

Ich kann erfolgreich ein neues Dokument erstellen, aber wenn ich versuche, es zu aktualisieren, überschreibt er den ganzen userBios Array anstatt es zu aktualisieren.

My Document Schema:

// define the schema for our bios model 
var biosSchema = mongoose.Schema({ 
    firstName: String, 
    lastName: String, 
    jobTitle: String, 
    userID: String, 
    userBios: [{bioForSector: String, background: String, skills: [String], experience: {}}] 
    }); 

Was mache ich falsch? Kann jemand helfen? es wird sehr geschätzt!

+0

Was meinen Sie mit _überschreibt das ganze Dokument_? Welche Bedingung wird erfüllt? – Rayon

+0

@RayonDabre Wenn der Benutzer ein neues Dokument erstellt, enthält es den "Hintergrund, Fähigkeiten, Erfahrung" für die erste Biographie, aber wenn der Benutzer es aktualisiert, dann drückt der neue "Hintergrund, Fähigkeiten, Erfahrung" als neues Objekt in den 'userBios' Array innerhalb des Schemas überschreibt es das vorherige mit allen Nulldaten. Das bedeutet, dass die Variablen "background, skills, experience" in der Datenbank in "null" geändert werden. Hilft das? – Skywalker

+0

@RayonDabre Ich habe meine Formulierung ein wenig geändert, ich meine, es überschreibt das ganze "userbios" -Array, anstatt es zu aktualisieren, indem ein neues Objekt hineingeschoben wird. – Skywalker

Antwort

0

Wie Alexander Mac in den Kommentaren sagt, überschreiben Sie das Array selbst. Wenn das Dokument existiert, versuchen Sie:

if (bio) { 
    console.log("Bio document for user already exists!"); 
    bio.userBios.push({ 
     background: req.body.userBios.background, 
     experience: req.body.userBios.experience, 
     skills: req.body.userBios.skills, 
     bioForSector: req.body.userBios.bioForSector 
    }); 
    bio.save(function(err) { 
     if (err) 
      throw err 
     return (null, bio) 
    }); 
} 

Auf diese Weise schieben Sie es wirklich in einem vorhandenen Array, anstatt einen neuen zu erstellen.

+0

danke Sonaryr & Alexander Mac, das hat funktioniert! – Skywalker

Verwandte Themen