2016-06-14 8 views
2

findOneAndUpdate()メソッドを使用して、ドキュメントが存在しない場合は作成するか、存在する場合は更新します。次のコードを考えてみましょう:MongoDB/Mongoose:findOneAndUpdate()でドキュメント全体を更新する

 SampleComment = new Comment({ 
      id: '00000001', 
      name: 'My Sample Comment', 
      ... 
     }) 

これはSampleCommentのaldreadyが存在するかどうかを調べるために私の試みであり、もしそうなら、それを更新し、そうでなければ作成:

 Comment.findOneAndUpdate(
      { id: SampleComment.id }, 
      { SampleComment }, // <- NOT PASSING THE OBJECT 
      { upsert: true, setDefaultsOnInsert: true }, 
      function(error, result) { 
       ... 
     }); 

私がモデルに合格しようとしています-instanceは第2引数のオブジェクトとして実行されますが、結果はモデルのデフォルト値のみを返します。同じことがドキュメント自体にも当てはまります。

オブジェクトSampleCommentを第2引数に正しく渡すにはどうすればよいですか?

答えて

1

デフォルトでは、返される結果は変更されていないドキュメントになります。更新された新しい文書を返すには、trueの値を持つnewという追加の引数を渡す必要があります。

Comment.findOneAndUpdate({id: SampleComment.id}, SampleComment, {new: true, upsert: true, setDefaultsOnInsert: true}, function(error, result) { 
    if(error){ 
     console.log("Something wrong when updating data!"); 
    } 

    console.log(result); 
}); 

http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdateを参照してください:

function(error, doc) { 
    // error: any errors that occurred 
    // doc: the document before updates are applied if `new: false`, or after updates if `new = true` 
} 
+0

私は '{new:true}'パラメータを試しましたが、他のものは間違っているようです。 '$ set'を追加すると、' [TypeError:プロパティ 'toObject' of nullを読み取れません] ' –

+0

コンソールに' SampleComment'を出力して、nullでないかどうか調べてください。また、私は自分の投稿から$ setを取り除き、 'SampleComment'を中括弧なしで入れてみてください。 – Kairat

+0

console.logは、すべてのプロパティを含む完全なオブジェクトを返します。私は$ setと中括弧を削除しようとしました。エラーは消えましたが、オブジェクトはまだ渡されず、dbドキュメントは空のままですが、デフォルト値はそのままです。 –

0

私はそれが簡単かつ迅速にする方法を見つけました:私はちょうどに必要な私の場合はD

フォームからオブジェクトを挿入して更新doc。たぶん誰かを助けます:

Angularjsコントローラー:

$scope.bike ={}; 
    fBikeFactory.get({ 
     id:$stateParams.id 
     }) 
     .$promise.then(function (response) { 
     $scope.bike = response; 
     },function (response) { 
     $scope.bike = "Error: " + response.status + " " + response.statusText; 
     }); 


// UPDATE a BIKE 
     $scope.saveBike = function() { 
     $scope.processing = true; 

     var updateQuery = fBikeFactory.update({id: $stateParams.id}, $scope.bike); 
     updateQuery.$promise.then(function(rep) { 
      $scope.processing = false; 
      $scope.message = "Desat amb èxit"; 
      setTimeout(function(){ $state.go('home.adminBikes');$scope.bike.message = ''; }, 750); 
     },function(err) { 
      $scope.processing = false; 
      $scope.message = 'Error al Desar, torna a provar-ho.'; 
     }) 
     }; 

はモデルが必要:

var Bike = require('../models/bikeModel.js'); 

を...

ROUTE:

bikesRouter.route('/bikes/:id') 
    .put(function(req,res) { 


    Bike.findOneAndUpdate(
      {_id: req.params.id}, // find a document with that filter 
      req.body, // document to insert 
      {upsert: true, new: true, runValidators: true}, // options 
      function (err, updatedBike) { // callback 
       if (err) console.log('ERROR '+ err); 
       else res.json(updatedBike) 

      } 
     ); 
    }); 

助けてくれる希望:D

関連する問題