2015-05-07 43 views
0

我正在使用mongoose/nodeJS,我正在使用node-migrate編寫一些遷移腳本。如何取消Mongo中所有文檔中的唯一字段?

我的更新腳本中添加一個新的計算字段集合中的所有文件:

exports.up = function (done) { 
    Posts.find({_hash: null}, function (err, posts) { 
    async.forEach(posts, function (post, next) { 
     var hash = hash(post); 
     post.update({_hash: hash}, next); 
    }, done); 
    }); 
}; 

和工作正常。我抓取所有沒有hash字段的文檔,計算它並更新記錄。

node-migrate也支持「向下」遷移,以回滾更改。在這種情況下,我想刪除來自所有文檔的散列字段。

exports.down = function (done) { 
    Posts.update({_hash: {$ne: null}}, {$unset: {$hash: 1}}, {multi: true}, done); 
}; 

但我得到一個重複鍵錯誤。模式確實將該字段定義爲唯一索引,這樣纔有意義。

如果該字段被定義爲唯一的,我如何從集合中的所有文檔中取消/刪除字段?

謝謝。

+0

我只注意到了DUP鍵錯誤看起來小疑犯:'MongoError:E11000重複鍵錯誤索引:myApp.posts。$ _ hash_1 dup鍵:{:null}'..?它爲什麼說'dup key:{:null}',它看起來像一個沒有鍵的對象字面值,只是一個空值。或者我讀錯了嗎? –

+0

您的代碼示例中有語法錯誤。 Posts.udpate的第一個參數缺少一個關閉的'}':'{_hash:{$ ne:null}' –

+0

謝謝@AndrewLavers,只是SO文章中的一個錯字;無關。雖然固定。 –

回答

0

唯一索引不會允許索引字段丟失的多個文檔或null

爲了支持這一點,您需要刪除hash上的現有唯一索引,並將其重新創建爲唯一索引sparse

刪除索引在shell:

db.posts.dropIndex('$_hash_1') 

更新您的模式中的hash定義,使其稀疏,唯一索引:

hash: {type: String, index: {unique: true, sparse: true}} 
相關問題