2011-03-15 96 views
7

我在這裏抓我的頭像往常一樣,它似乎與節點項目,我不知道如果我做錯了什麼或如果我遇到了一個錯誤。Mongoose不會刪除嵌入的文檔

我有一個服務器架構,可以有任意數量的稱爲服務的嵌入式文檔。儘管我已經成功地從服務器對象中刪除了單個服務,但在我告訴它保存時不會將其從數據庫中刪除,但我仍然遇到了問題。保存功能正在發揮作用,因爲它保存了我所做的任何更改,並且還推出了新的嵌入式文檔,它只是不刪除已經存在的文檔。

這裏是我的代碼相對簡單的例子:所以刪除()實際上是除去服務

app.put('/server/:id', function(req, res, next){ 
    app.Server.findOne({_id: req.params.id}, function(err, server) { 
    server.updated = new Date(); 
    ... 

    for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){ 
     // Is this a new service or an existing one 
     if (server.services[num]) { 
     // Is it marked for deletion? If so, delete it 
     if (req.body.server.services[num].delete == "true") { 
      server.services[num].remove() 
     } else { // else, update it 
      server.services[num].type = req.body.server.services[num].type 
      ... 
     } 
     } else { 
     // It's new, add it 
     delete req.body.server.services[num]["delete"] 
     server.services.push(req.body.server.services[num]); 
     } 
    } 

    server.save(function(err){ 
     if (!err) { 
     req.flash('success', 'Server updated') 
     } else { 
     req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!') 
     console.log(err) 
     } 
     res.redirect('/') 
    }); 
    }) 
}); 

。如果我在保存前做了一個server.toObject(),它不在那裏。任何想法,爲什麼它不會從數據庫中刪除它時保存?

編輯:我想版本號會有幫助。 [email protected][email protected] [email protected]

+0

我有同樣的問題。 – Carlosedp 2011-03-19 16:54:20

回答

3

我找到了一種方法來臨時解決這個問題。

我所做的是將嵌入式文檔加載到數組中,拼接要刪除的文件並替換數組。事情是這樣的:

var oldusers = dl.users; 
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1); 
dl.users = oldusers; 
dl.save(function(err) {... 

我知道,這取決於文件的大小它將

+0

這樣做。謝謝! – mattmcmanus 2011-03-21 21:24:46

+0

這確實有用,但是有誰知道我們爲什麼必須將此作爲解決方法? – 2014-07-16 15:09:09

4

我可能是錯的,因爲我沒有測試你的榜樣,但是這聽起來像貓鼬沒有檢測嵌入文檔被修改。

schema types documentation page

既然是無模式的類型,您可以將該值更改爲任何你喜歡的,但貓鼬失去了自動檢測/保存這些更改的能力。爲了「告訴」Mongoose混合類型的值已更改,調用文檔的.markModified(路徑)方法將路徑傳遞給您剛剛更改的混合類型。

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything'); 
person.save(); // anything will now get saved 

所以你的答案可能就像使用markModified()函數一樣簡單。

+1

這將是完美的,除了markModified不適用於兒童。請參閱:https://github.com/LearnBoost/mongoose/issues/435 – k00k 2012-01-18 02:39:12

+0

在我的情況下工作。非常感謝你! – JMax 2012-06-01 18:25:42

+0

Carlosedp的解決方案僅適用於少數情況下的我。這似乎無處不在,似乎是更「正確」的方法。謝謝! – 2012-10-31 14:43:47