2015-05-07 45 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}} 
相关问题