【发布时间】:2015-07-17 10:57:30
【问题描述】:
我正在使用 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);
};
但我得到一个重复的键错误。架构确实将该字段定义为唯一索引,所以这很有意义..?
如果某个字段被定义为唯一字段,我如何从集合中的所有文档中取消设置/删除该字段?
谢谢。
【问题讨论】:
-
我刚刚注意到 dup 密钥错误看起来有点可疑:
MongoError: E11000 duplicate key error index: myApp.posts.$_hash_1 dup key: { : null }..?为什么它说dup key: { : null },它看起来像一个没有键的对象文字,只有一个空值。还是我读错了? -
您的代码示例中有语法错误。
Posts.udpate的第一个参数缺少结束}:{_hash: {$ne: null} -
感谢@AndrewLavers,只是 SO 帖子中的一个错字;无关。不过已修复。