2014-01-13 23 views
7

我是新來的貓鼬所以這可能是非常簡單..但是。節點,Mongoose:保存()「VersionError:未找到匹配的文檔。」

我有一個非常簡單的模式,它包含數字的簡單數組:

userSchema = new mongoose.Schema({ 
name  : String, 
tag_id  : String, 
badges  : [Number] 
}); 

var user = mongoose.model('User', userSchema); 

後來我想徽章添加到用戶。所以..

user.findOne({tag_id:tagid}, function(err,doc) { 
    if (!doc) callback(false, 'no doc'); 

    // check to see if badge is in array, if not add it 
    if (doc.badges.indexOf(badgeNum) == -1) { 
     doc.badges.push(badgeNum); 
     doc.save(function(err) { 
      if (err) callback(false, err); 
      else callback(true, ''); 
     }); 
    } else { 
     callback(false, 'user already had badge') 
    } 
}); 

但是每當我運行代碼,我得到一個「VersionError:沒有匹配的文件中。」

我做了一點Google搜索,發現在3.x mongoose中添加了版本控制的參考,並且它通常都是在內部處理的。應該注意的是,我通過json和mongo命令行將這個用戶數據直接加載到mongo中(所以它不會有默認定義的版本控制變量,但是我懷疑貓鼬會在沒有找到它時創建它。不好的假設?)

編輯:對不起,我的簡化的例子有一個錯誤。

回答

4

我通過將版本字段添加到導入的數據集並修改模式以將其與versionKey關聯來解決此問題。

http://mongoosejs.com/docs/guide.html#versionKey

我還是懷疑,但是如果沒有一個設置,讓貓鼬添加默認versionkey(__v)數據缺乏它。

+1

你可能想要閱讀[亞倫的博客文章](http://aaronheckmann.blogspot.com/2012/06/mongoose-v3- part-1-versioning.html)瞭解versionKey的工作原理。如果要將常規對象保存到數據庫中,貓鼬應該在幕後添加版本控制密鑰。 –

+1

我認爲,如果我沒有記錯,這是全部造成的,因爲我將數據加載。 –

+1

嗨,你是如何將版本字段添加到數據集並修改模式以將其與versionKey關聯的?你能更具體一點嗎?如果這樣會很棒!謝謝!我和你有完全相同的問題... – user1567909

0

您正試圖將testSchema指定給user對象而不是userSchema,因此它正在查找尚未創建的文檔類型。

更新的用戶分配到以下幾點:

var user = mongoose.model('User', userSchema); 

我建議你遵循the guides,如果你不知道自己在做什麼。

+0

對不起,我的壞在那裏,複製+粘貼+簡化=錯誤的代碼;) –

相關問題