全部。从昨天起这一直困扰着我,任何帮助将不胜感激。我的用户模型有其他模型的数组,如下所示:
var userSchema = new Schema({
addresses : [{ type: mongoose.Schema.Types.ObjectId,
ref: 'Address'
}]
现在,当在我的 Controller 中运行更新函数时,我想更新一个对象(如果它已存在于数组中),或者创建一个新对象(如果不存在)。我在地址实例中使用模型中的addressType 属性来检查地址是否已存在于数组中。
在我的 usersController 中: 创建函数:
function createAddress(req, res){
User.findOne({ user_id: req.params.id}, function(err, user){
Address.create(req.body, function(err, address){
user.addresses.push(address)
})
})
}
这是更新函数的片段:
function updateUser (req, res) {
console.log("updating user in back end")
User.findOneAndUpdate({user_id: req.params.id}, req.body, function(err, user){
if(err) throw err
Address.findOne({address_id: req.params.id}, req.body, function(err, address){
if(err) throw err
if({addressType: req.params.id} != req.body.addressType){
createAddress(req);
} else {
Address.findOneAndUpdate({address_id: req.params.id}, req.body, function(err, address){
if(err) throw err
})
}
看起来它可以工作,但是每次运行它时,即使我通过 postman 发送完全相同的信息,我也会在数据库中得到一个新对象。任何帮助将不胜感激,我提前感谢您的宝贵时间。
最佳答案
if({addressType: req.params.id} != req.body.addressType)
您将对象与字符串进行比较。它始终不等于
。
if (address) {
update();
} else {
create();
}
更好的是使用 upsert
选项:
Address.findOneAndUpdate({address_id: req.params.id}, req.body, {
upsert: true
}, callback);
关于arrays - Node/Mongoose - 如果更新期间对象尚不存在,则无法在数组中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37380227/