【问题标题】:mongoose | update all documents according to a field in each document猫鼬 |根据每个文档中的字段更新所有文档
【发布时间】:2018-02-14 20:02:43
【问题描述】:

我有一个集合,我想根据字段email 更新它的所有文档并将其转换为小写。

const addressBookSchema = new Schema({
    email: String,
});
const addressBook = mongoose.model("address_book", addressBookSchema)

我正在尝试执行以下操作:

addressBook.update({}, {$set: {email: email.toLowerCase()}}, {multi: true});

但这不起作用。

如何获取电子邮件字段并将其设置为小写?

【问题讨论】:

  • this
  • @Vikig 我了解如何在一个文档上执行此操作(然后我有 e 对象作为您发送的参考)。问题是如何为所有人做到这一点
  • 还有,这里addressBook是什么,应该是Model
  • @ViKiG 是的,你是对的。我只是没有写完整的代码。但我已经更新了我的问题。谢谢

标签: javascript mongoose


【解决方案1】:

为了在所有文档上执行此操作,

addressBook.find({}, {email: 1})
    .exec((err, docs) => {
        if (err || docs == undefined || docs.length == 0)
            ;
        else {
            docs.forEach((doc) => {
                 addressBook.findOneAndUpdate({_id: doc._id}, 
                                              {$set: {email: doc.email.lowercase()}})
                 .exec();
            });
       }
    });   

【讨论】:

  • 这是一个庞大的集合(超过 400,000 个文档)。我正在寻找一种在一次操作中完成此操作的解决方案
  • 你想在所有文档上运行它吗?
  • 这行得通。但我希望通过update 对整个集合进行一次操作
  • 没有这样的解决方法,您可以简单地申请$toLower 进行更新。您必须获取旧值,用小写替换它们。
【解决方案2】:

如果你有这么大的数据集,你应该使用bulkWrite()函数

addressBook.bulkWrite([
  {
    updateMany: {
      filter: {},
      update: { email: email.lowercase()}
    }
  },
]).then(handleResult);

【讨论】:

  • doc 定义在哪里?
  • 同样的问题:email 未定义 - 因此您无法对其执行 toLowerCase()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2020-10-18
  • 2016-05-24
  • 2021-03-22
  • 2021-12-31
  • 2020-02-26
相关资源
最近更新 更多