2017-07-15 3 views
0

Nach vielen gescheiterten Versuchen, meine Logik zu korrigieren, suche ich nach Hilfe.Mongoose speichert keine Daten in mLab

Ich benutze Knoten, Express, Passport, Mongoose, MongoDB, um eine Anwendung zu erstellen. Bisher ein Benutzer sich anmelden können und melden Sie sich an, wenn sich der Benutzer auf sie dieses Schema definiert sind.

var userSchema = mongoose.Schema({ 

    local : { 
    username : String, 
    password : String, 
    }, 
    jobs : [{ type: mongoose.Schema.Types.Mixed }] 

}); 

den Benutzer Speichern wird durch das getan:

var newUser = new User(); 

      // set the user's local credentials 
      newUser.local.username = username; 
      newUser.local.password = newUser.generateHash(password); 
      newUser.jobs = []; 
      // save the user 
      newUser.save(function(err) { 
      if (err) { 
       console.log(err); 
       throw err; 
      } 
     console.log('user saved: ', newUser); 
     return done(null, newUser); 
     }); 

die in diesem MongoDB Ergebnisse doc:

{ 
    "_id": { 
     "$oid": "596a436a2981ab1729a4f08b" 
    }, 
    "local": { 
     "password": "$2a$08$TV2rADNbm302cREGRzfRFOtZF4mA8kYCeBjcmalPCk./flUO3wM.6", 
     "username": "kev" 
    }, 
    "__v": 0 
} 

Beachten Sie die fehlenden Arbeitsplätze Eintrag. Ich glaube nicht, dass ein Problem sein würde, obwohl, wenn ich jetzt die doc versuchen Aktualisierung durch einen Job Zugabe mit:

User.findOne(
     { 'local.username': req.user.username }, 
     // { $push: { 'jobs':{'website': req.body.joblink } } }, 
     // { returnNewDocument: true }, 
     function(err, user) { 

     // if there are any errors, return the error 
     if (err) { 
      console.log(err); 
      return done(err); 
     } else { 
      user.jobs = []; 
      user.jobs.push({'website': req.body.joblink}); 
      console.log(user.jobs); 
      user.save(function(err) { 
      if (err) { 
       console.log(err); 
       throw err; 
      } 
      console.log('user updated: ', user); 
      res.redirect('/profile'); 
      }); 
     } 
    }); 

Der Mongo doc unverändert ist, während die

console.log (‘ Benutzer aktualisiert: ', Benutzer);

zeigt das korrekte Dokument an.

+0

Sie * sagen: „Das Mongo doc ist unverändert“ * aber wo suchen Sie tatsächlich auf das Dokument? Dieser Code versucht nicht, das geänderte Dokument zu lesen. Wenn Sie die Daten "manuell" betrachten, stellen Sie Folgendes sicher: 1. Sie betrachten tatsächlich dasselbe Dokument, von dem Sie glauben, dass es modifiziert wird (beachten Sie, dass nichts ".findOne()" stoppt und nur "eins" von vielen auswählt mögliche Dokumente). 2. Dass Sie tatsächlich die richtige Sammlung betrachten, da Mungo-Modelle standardmäßig den Sammlungsnamen "Plural" verwenden, in diesem Fall "Benutzer", wobei "Benutzer" als Modellname angegeben wird. –

+0

Ich schaue mir das Dokument in mLab an, das ich für meinen Datenbankspeicher verwende. Ich schaue definitiv auf das gleiche Dokument, das ich modifiziere, da es keine doppelten Benutzer in der Benutzersammlung geben sollte. Wenn ich die Sammlung korrekt erstellt habe, habe ich eine Sammlung namens users erstellt, in der Dokumente namens User gespeichert werden, in der das Schema-Modell oben angezeigt wird. – klewis

Antwort

0
You should use findOneAndUpdate() method of mongodb 

    https://docs.mongodb.com/v3.2/reference/method/db.collection.findOneAndUpdate/ 
    Like that 
    var json = {'website': req.body.joblink}; 

    User.findOneAndUpdate(
     { 'local.username': req.user.username }, 
     { $push: { jobs: json }); 

Sie haben Ihr Schema zu aktualisieren: -

var userSchema = mongoose.Schema({ 

     local : { 
     username : String, 
     password : String, 
     }, 
     jobs : { 

     type: Array, 
     default: [] 
     } 

    }); 

Nach Schema Aktualisierung Wenn Sie zum ersten Mal Dokument speichern und wenn Sie nicht Arbeitsplätze in json vorbei, es wird automatisch einen Standard-Array erstellen.

Danach Sie $ Push verwenden können Aufträge zu aktualisieren

+0

Während es in der Tat "besser" wäre, '.findOneAndUpdate()' oder einfach nur '.update()' zu verwenden, um eine Änderung vorzunehmen, ist dies nicht die eigentliche Ursache des in der Frage geposteten Problems. Die Verwendung von '.save()' ist nicht die "beste" Methode, aber es funktioniert sicherlich. Bitte schreiben Sie auch nicht in Antworten mit Beispielen, die eindeutig nicht auf die gestellte Frage zutreffen. Sie werden nicht aufgefordert, "name" oder "assignment" zu setzen oder ein "points" -Feld zu inkrementieren. Solche Antworten "sehen" (und oft sind es) einfache Risse aus anderen Antworten aus. Vor allem, wenn die Antwort die Aktionen nicht erklärt. –

+0

Um stumpfer zu sein. Sie sind [kopieren diese "Antwort" von dieser Quelle] (https://github.com/mongodb/docs/blob/master/source/reference/method/db.collection.findOneAndUpdate.txt#L209), und das Fehlen von Erklärung von Operatoren und falsche Terminologie (es ist nicht JSON) weist darauf hin, dass Sie einfach gezeigt haben, dass Sie eine Suchmaschine verwenden können, mehr als ein Verständnis für die richtige Operation oder die Antwort auf die Frage. –

+0

Ich versuchte mit '.findOneAndUpdate() 'Anfangs, aber ohne Erfolg, löste ich das Problem, vor dem ich stehe. Ich habe '$ push' verwendet, um das Array zu aktualisieren, aber es gibt kein Array im Dokument, wenn ein neuer Benutzer sich anmeldet. @NeilLunn @ ashish-maurya – klewis

Verwandte Themen