【问题标题】:How do I unset a unique field from all documents in Mongo?如何从 Mongo 的所有文档中取消设置唯一字段?
【发布时间】: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 帖子中的一个错字;无关。不过已修复。

标签: node.js mongodb mongoose


【解决方案1】:

唯一索引不允许多个文档缺少索引字段或null

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

在shell中删除索引:

db.posts.dropIndex('$_hash_1')

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

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

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2017-04-08
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多