我在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.address
和user.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 });
})
})
}
如何在不进行模型验证的情况下从模型中获取当前数据?
我认为您应该恢复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];
完成此操作后,您可以使用对象架构重写address
和phone
字段,复制 tmpAddress -> 地址和 tmpPhone -> 电话,并删除 tmpAddress 和 tmpPhone 字段。
希望对您有所帮助。