2016-02-25 53 views
8

你好我使用MongoBD與節點JS,我用npm install mongodbfindOneAndUpdate:真返回原始文件的MongoDB

我想更新現有的文檔,並且返回更新的文件,這個文件被正確更新。但它返回舊文檔意味着更新前的原始文檔。我使用了returnNewDocument:true參數,但沒有用。

  var filter = { 
       '_id': object_id 
      }, 
      update = { 
       $set: { "status" : data["status"] }, 
       $push: { 
        "statusHistory": { 
         $each: [{ status:data["status"],statusChangedTime:data["statusChangedTime"],comment:data["comment"]}], 
         $position:0, 
        } 
       }, 
      } 
      ,options = { 
       //upsert: false, 
       //multi: false, 
       returnNewDocument: true 
      }; 

      col.findOneAndUpdate(filter, update, options,function(err, res) { 
       if (err) { 

        console.log(err); 
       }else { 

        console.log(res); 
       } 
      }); 

的響應

{ lastErrorObject: { updatedExisting: true, n: 1 }, 
    value: 
    { 
//original document 
    },  
    ok: 1 } 

時,我直接去的MongoDB通過終端和嘗試

db.MyCollection.find().pretty(); 

文檔被正確地更新,它只是返回原始的,而不是更新的一個。

困在這裏2小時,任何幫助表示讚賞

中的package.json

"mongodb": "^2.1.4", 
+0

什麼版本的MongoDB使用? 3.2? – Saleem

回答

30

Node.js的driver documentation沒有提到爲findOneAndUpdate()一個returnNewDocument選項(這對於一個選項MongoDB shell command具有相同的名稱)。

取而代之的是,它提到了一個名爲returnOriginal的選項,默認爲true。嘗試使用該選項,將其設置爲false以返回更新的文檔而不是原始文檔。

+7

你是對的。不幸的是,命名不一致也被蒙上了一層陰影。希望他們能解決它。 – Saleem

+0

很棒,解決了這個問題。非常感謝:) :) –

+1

這裏在這個問題上失去了1小時。多謝。 – Sulliwane

1

node js mongoDb driver已經從mongo shell命令中分化出來了。如果您正在使用 「的MongoDB」: 「^ 2.1.4」,然後使用

returnOriginal:假

代替

returnNewDocument:真

讓我們來看看下面的代碼:

db.collection('user_setting').findOneAndUpdate({user_id: data.user_id}, {$set: data}, {projection: dbConfig.userSetting, returnOriginal: false}, function (err, res) { 
     if (err) { 
      callback({'error': 1, 'message': 'Internal server error! ' + err, 'data': null, 'status': 500}); 
     } else { 
       console.log(res); 
       /* { lastErrorObject: { updatedExisting: true, n: 1 }, 
         value: 
          { user_id: 1, 
          notification_alert: 1, 
          notification_sound: 1, 
          user_setting_id: 2 
          }, 
         ok: 1 
        }  */  
     } 
    });