2015-05-22 71 views
2

這個基本的Mongoose模型代碼在初始調用時返回空結果(gameMgr),但對後續調用起作用。它不應該返回初始upsert上的填充結果對象嗎? mongo記錄存在,並且在相同的情況下第二次運行代碼,因爲沒有插入,所以一切正常。Mongoose findByIdAndUpdate upsert在初始插入時返回空文檔

如果預期爲空結果對象,那麼創建新對象的適當模式是什麼? (或做我重裝與另一分貝呼叫,並進一步陷入回調瘋狂?)

GameManagerModel.findByIdAndUpdate(
    game._id, 
    {$setOnInsert: {user_requests:[]}}, 
    {upsert: true}, 
    function(err, gameMgr) { 
     console.log(gameMgr); // NULL on first pass, crashes node 
     gameMgr.addUserRequest(newRequest); 
    } 
); 

回答

6

在貓鼬4.0,爲findByIdAndUpdate(和findOneAndUpdate)的new選項的默認值已更改爲false(見release notes )。這意味着你需要明確地將選項設置爲true以獲得由upsert創建的文檔:

GameManagerModel.findByIdAndUpdate(
    game._id, 
    {$setOnInsert: {user_requests:[]}}, 
    {upsert: true, new: true}, 
    function(err, gameMgr) { 
     console.log(gameMgr); 
     gameMgr.addUserRequest(newRequest); 
    } 
); 
+1

完美,謝謝!隱藏在ye ol中的隱藏參數'發佈說明再次出現。文檔目前說「新:布爾 - 真正的返回修改後的文檔,而不是原來的。默認爲真」 http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate – Stickley

+0

我有點困惑,至於爲什麼貓鼬改變了默認..對我來說似乎很奇怪 – dworrad

+0

{new:true}做了詭計! – Flaudre