首页 > 解决方案 > Mongoose 获取当前数据,即使它对模型无效

问题描述

我更改了 User.model 中的两个属性:

address: [
   {
      street: String,
      number: Number,
      city: String,
      country: String
}],
phone: [
   {
      landLine: String,
      mobilePhone: String
}]

只对一个对象:

address:{
      street: String,
      number: Number,
      city: String,
      country: String
},
phone:{
      landLine: String,
      mobilePhone: String
}

但是,仍然有一些用户在其上持有一个数组。所以我创建了一个脚本来更新这些用户,但是在使用时User.find({}),电话和地址属性是undefined. 我想那是因为当前模型无效。

由于user.addressuser.phone都是undefined,因此数据对象将仅包含 2 个空对象电话和地址,这导致用户没有地址和电话。

这是我用于获取和更新用户的代码:

function updateUser(id, data){
    return new Promise( (resolve, reject) =>{
        User.findByIdAndUpdate(
            {_id: id},
            {
                $set: data
            }
        ).exec( (err, res) => {
            if(err) return reject(err);
            return resolve();
        })
    })
}

module.exports.updateUsers = (req, res) => {
    Users.find({}).exec( (err, users) => {
    //For testing, update only 1 user
    //User.find({username: 'some@emailaddress'}).exec( (err, users) => {
        if(err) return res.status(500).json({message: "Error getting users"})

        return blueBird.mapSeries(users, (user) => {

            let data = {
                address: {},
                phone: {}
            }

            if(user.address && user.address.length > 0){
                data.address = user.address[0];
            }
            if(user.phone && user.phone.length > 0){
                data.phone = user.phone[0];
            }

            return updateUser(user._id, data);
        })
        .then(() => {
            return res.status(200).json({ status: true, message: "Users are updated" });
        })
        .catch((e) => {
            return res.status(500).json({ status: false, message: "Some error occured while code execute.", error: e });
        })
    })
} 

如何在没有模型验证的情况下从模型中获取当前数据?

标签: node.jsmongoose

解决方案


我认为你应该恢复你的address和模式,并使用你的新对象模式phone创建临时字段(如tmpAddress和),如下所示:tmpPhone

address: [{
    street: String,
    number: Number,
    city: String,
    country: String
}],
phone: [{
    landLine: String,
    mobilePhone: String
}],
tmpAddress: {
    street: String,
    number: Number,
    city: String,
    country: String
},
tmpPhone: {
    landLine: String,
    mobilePhone: String
}

然后你像这样保存你的新字段:

data.tmpAddress = user.address[0];
data.tmpPhone = user.phone[0];

完成后,您可以使用 Object Schema 重写您的addressphone字段,复制 tmpAddress -> address 和 tmpPhone -> phone,并删除 tmpAddress 和 tmpPhone 字段。

希望能帮助到你。


推荐阅读