2017-07-15 8 views
0

私のロジックを修正しようとして失敗した多くの試みの後、私は助けを求めることに頼っています。MongooseがmLabにデータを保存していない

私はNode、Express、Passport、Mongoose、MongoDBを使ってアプリケーションを作成しています。

var userSchema = mongoose.Schema({ 

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

}); 

ユーザーはこれによって行われます保存:

このMongoDBのになり
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); 
     }); 

。彼らは、このスキーマで定義されているときにユーザーがサインアップし、これまでにユーザーがサインアップしてログインすることができます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'); 
      }); 
     } 
    }); 

Mongoのドキュメントが

にconsole.logながら変更されていません(」ユーザー更新: '、ユーザー);

は、正しい文書を表示します。

あなたのスキーマを更新する必要が
+0

を更新するために、$のプッシュを使用できますか?このコードは、変更されたドキュメントを読み取ろうとしません。データを "手動で"見ている場合は、次のことを確認してください。1.実際にあなたが修正していると思っている文書を見ています(多くの文書のうちの1つだけを選択している.findOne()可能な文書)。 2.あなたが実際に正しいコレクションを見ていることは、マングースモデルはデフォルトで "複数の"コレクション名を使用します。この場合、 "users"はモデル名として ''ユーザー ''になります。 –

+0

私は自分のデータベースストレージに使用しているmLabの文書を見ています。私は間違いなく、ユーザーコレクション内に重複するユーザーが存在しないように、私が変更している同じドキュメントを見ています。コレクションを正しく作成した場合は、ユーザと呼ばれるドキュメントを格納するコレクションというコレクションを作成しました。ここで、スキーマモデルは上に表示されます。 – 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で仕事を渡していない場合、それは自動的にデフォルトの配列を作成します。その後

あなたは*「モンゴドキュメントが変更されていない」*しかし、ここであなたが実際に文書を見ていると言う仕事

+0

変更を加えるために '.findOneAndUpdate()'または単に '.update()'を使うのが "良い"のですが、これは質問に掲載された問題の実際の原因ではありません。 '.save()'を使うことは "ベスト"な方法ではありませんが、確かにうまくいきます。また、尋ねられた質問にはっきりと当てはまらない例を使って答えを書いてください。彼らは ''名前 ''や' '代入''を設定したり、 '' points ''フィールドを増やしたりすることを求めていません。そのような反応は、他の回答からの "見た目のような"(そして、しばしばそうである)単純な裂け目である。特に応答がアクションを説明していないとき。 –

+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

関連する問題