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

Node.js 如何从Mongo中的所有文档中取消设置唯一字段?,node.js,mongodb,mongoose,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.upd

我正在使用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);
  });
};
这很好。我正在抓取所有没有
散列
字段的文档,计算它,并更新记录

但是
node migrate
也支持“向下”迁移,以回滚更改。在本例中,我希望从所有具有散列字段的文档中删除散列字段

exports.down = function (done) {
  Posts.update({_hash: {$ne: null}}, {$unset: {$hash: 1}}, {multi: true}, done);
};
但是我得到了一个重复的密钥错误。模式确实将该字段定义为唯一索引字段,因此这是有意义的

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


谢谢。

如果索引字段缺失或
null
,则唯一索引将不允许多个文档

为了支持这一点,您需要在
散列中删除现有的唯一索引,并将其重新创建为唯一索引

将索引放入shell中:

db.posts.dropIndex('$_hash_1')
更新架构中
散列的定义,使其成为稀疏的唯一索引:

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

我刚刚注意到dup密钥错误看起来有点可疑:
MongoError:E11000重复密钥错误索引:myApp.posts。$\u hash\u 1 dup密钥:{:null}
。。?为什么它会说
dup key:{:null}
,它看起来像一个没有键的对象文本,只有一个null值。还是我读错了?您的代码示例中有语法错误。
Posts.udpate
的第一个参数缺少一个结束符
}
{u hash:{$ne:null}
谢谢@AndrewLavers,只是SO post中的一个输入错误;不相关。不过已修复。