猫鼬会获得当前数据,即使它对模型无效

时间:2019-09-11 06:47:36

标签: node.js 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 });
        })
    })
} 

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

1 个答案:

答案 0 :(得分:1)

我认为您应该还原addressphone模式,并使用如下的新Object模式创建临时字段(例如tmpAddresstmpPhone):

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];

完成此操作后,您可以使用对象架构重写addressphone字段,复制tmpAddress-> address和tmpPhone-> phone,并删除tmpAddress和tmpPhone字段。

希望有帮助。