2014-02-26 15 views
3

使異步請求在循環中從嵌入式集合中刪除文件:Mongoose使用id()方法找不到匹配的文檔。造成異步錯誤刪除請求

_.each deletedItem, (item) -> 
    item.$delete() 

不正常引發此錯誤:

{ message: 'No matching document found.', name: 'VersionError' } 

當執行:

var resume = account.resumes.id(id); 

resume.remove(); 

account.save(function (err, acct) { 
    console.log(err); 
    if(err) return next(err); 
    res.send(resume); 
}); 

記錄account.resumes並查看所有t的_id他恢復了,我試圖通過id找到的文件存在於集合中。

530e57a7503d421eb8daca65 FIND:

{ title: 'gggff', _id: 530e57a7503d421eb8daca65 } 

IN:

[{ title: 'asddas', _id: 530e57a7503d421eb8daca61 } 
{ title: 'gggff', _id: 530e57a7503d421eb8daca65 } 
{ title: 'ewrs', _id: 530e57a7503d421eb8daca64 }] 

我想這與我正在異步執行這些要求,或有事實做一個版本問題,但我不知道如何解決它。

它沒有任何意義,我如何當我登錄了resumes,我可以看到我resume試圖找到,但如果我登錄:

log(account.resumes.id(id)); 

我得到undefined

UPDATE

我發現,我的問題是與版本控制。

http://aaronheckmann.blogspot.com/2012/06/mongoose-v3-part-1-versioning.html

但我仍然不確定如何解決它沒有禁用的版本,這是我不想做的事。

回答

4

在mongodb版本3中,文檔現在有一個increment()方法,手動強制增加文檔版本。當數組上的操作可能改變數組元素的位置時,這也用於內部。這些操作是:

$pull $pullAll $pop $set of an entire array 

改變版本鍵

版本關鍵是通過傳遞versionKey選項架構構造定製:

new Schema({ .. }, { versionKey: 'myVersionKey' }); 

,或者直接設置選項:

schema.set('versionKey', 'myVersionKey'); 

disabling

如果您不想在模式中使用版本控制,則可以通過爲versionKey選項傳遞false來禁用它。

schema.set('versionKey', false); 
+0

設置'schema.set( 'versionKey',虛假); '爲我工作! – SharpCoder

0

Mongoose文檔明確警告不禁用版本控制。您的問題是由於工作流程。如果您要更新您的收藏從UI,發送API請求,而不是從後端對象刷新你的對象 - 然後嘗試再次更新它,你會遇到你所報告的錯誤。我建議要麼消耗/更新從API響應的對象範圍,則__v正確遞增。或者不發送的PUT API請求的__v場,這樣在數據庫收集它不會與版本衝突。

另一種選擇是 - 要求從後端對象時,有API響應不發送__v場,這樣你就不必代碼邏輯沒有從前端發送。在所有被該集合,請執行下列操作的任何一個(取決於你如何編寫查詢):

var model = require('model'); 
var qry = model.find(); 
qry.select('-__v'); 
qry.exec(function(err,results){ 
    if(err) res.status(500).send(err); 
    if(results) res.status(200).json(results); 
}); 

OR

var model = require('model'); 
model.find({}, '-__v', function(err,results){ 
    if(err) res.status(500).send(err); 
    if(results) res.status(200).json(results); 
});