Node.js 如何从Mongo中的所有文档中取消设置唯一字段?
我正在使用mongoose/nodeJS,并且正在使用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
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中的一个输入错误;不相关。不过已修复。