如何从Mongo中的所有文档中取消设置唯一字段?

时间:2015-05-07 03:29:16

标签: node.js mongodb mongoose

我正在使用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);
};

但我得到一个重复的密钥错误。模式确实将该字段定义为唯一索引,因此这有意义..?

如果该字段定义为唯一,如何取消/删除集合中所有文档的字段?

感谢。

1 个答案:

答案 0 :(得分:0)

唯一索引不允许索引字段丢失或null的多个文档。

为了支持这一点,您需要删除hash上的现有唯一索引,并将其重新创建为唯一的sparse索引。

删除shell中的索引:

db.posts.dropIndex('$_hash_1')

更新架构中hash的定义,使其成为稀疏的唯一索引:

hash: {type: String, index: {unique: true, sparse: true}}