2017-07-15 76 views
0

經過多次嘗試糾正我的邏輯失敗後,我訴諸於尋求幫助。Mongoose沒有將數據保存到mLab

我正在使用Node,Express,Passport,Mongoose,MongoDB來創建應用程序。到目前爲止,用戶可以註冊並登錄,當用戶註冊將被此架構定義:

var userSchema = mongoose.Schema({ 

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

}); 

保存用戶通過這個工作:

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); 
     }); 

導致這個的MongoDB doc:

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

注意丟失的作業條目。我不認爲這是一個問題,雖然,現在當我嘗試通過添加作業更新文檔:

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'); 
      }); 
     } 
    }); 

蒙戈文檔是不變的,而

的console.log(」用戶更新:',用戶);

顯示正確的文檔。

+0

您說*「Mongo文檔不變」*但您在哪裏查看文檔?此代碼不會嘗試讀取已修改的文檔。如果您正在手動查看數據,請確保:1.您實際上正在查看您認爲正在修改的相同文檔(請注意,沒有什麼能夠停止'.findOne()'只選擇多個「可能的文件)。 2.你實際上是在查看正確的集合,因爲默認情況下貓鼬模型默認使用「複數」集合名稱,在這種情況下,''用戶''給出'User''作爲模型名稱。 –

+0

我正在查看mLab中用於存儲數據庫的文檔。我肯定正在查看我正在修改的文檔,因爲在用戶集合中不應該有重複的用戶。如果我正確創建了集合,我創建了一個名爲users的集合,它將存儲稱爲User的文檔,其中架構模型顯示在上面。 – klewis

回答

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 }); 

你必須更新架構: -

var userSchema = mongoose.Schema({ 

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

     type: Array, 
     default: [] 
     } 

    }); 

更新模式,當你第一次保存文件,如果你不及格的工作在JSON,它會自動創建一個默認的陣列之後。

之後,您可以使用$ push來更新作業

+0

儘管使用'.findOneAndUpdate()'或甚至只是簡單的'.update()'來進行修改確實是「更好」的,但這不是問題中發佈的問題的實際原因。使用'.save()'不是「最好」的做法,但它確實有效。另外,請不要使用明顯不適用於所提問題的例子來回答問題。他們不要求設置''名稱''或''賦值''或增加''點''字段。這種迴應「看起來像」(通常是)與其他答案的簡單撕裂。特別是當答覆沒有解釋行動時。 –

+0

要更鈍。你[從這個源複製這個「答案」](https://github.com/mongodb/docs/blob/master/source/reference/method/db.collection.findOneAndUpdate.txt#L209),而缺乏操作員和不正確的teminology(它不是JSON)的解釋指出,您只是簡單地演示了您可以使用搜索引擎,而不僅僅是正確操作的理解或對問題的回答。 –

+0

我試過用'。findOneAndUpdate()'最初但我無法解決我面臨的問題。我使用'$ push'來嘗試更新數組,但當新用戶註冊時,文檔中沒有數組開始。 @NeilLunn @ ashish-maurya – klewis