我正在使用mongoose / nodeJS,我正在使用node-migrate
编写一些迁移脚本。
我的更新脚本正在为集合中的所有文档添加新的计算字段:
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 :(得分:0)
唯一索引不允许索引字段丢失或null
的多个文档。
为了支持这一点,您需要删除hash
上的现有唯一索引,并将其重新创建为唯一的sparse索引。
删除shell中的索引:
db.posts.dropIndex('$_hash_1')
更新架构中hash
的定义,使其成为稀疏的唯一索引:
hash: {type: String, index: {unique: true, sparse: true}}