Node / Mongoose - 如果在更新期间尚未存在对象,则无法在数组中创建对象

时间:2016-05-22 22:17:03

标签: arrays node.js mongodb mongoose

所有。自昨天以来,这一直困扰着我,任何帮助都将不胜感激。我的用户模型包含其他模型的数组,如下所示:

var userSchema = new Schema({               
addresses           : [{ type: mongoose.Schema.Types.ObjectId,
                         ref: 'Address' 
                      }]

现在,在我的控制器中运行更新功能时,我想更新一个对象(如果它已经存在于数组中),或者创建一个新对象(如果不存在)。在地址的实例中,我使用模型中的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
                    })
                }

似乎它会起作用,但每次运行它时,我都会在数据库中获得一个新对象,即使我通过邮递员发送完全相同的信息。非常感谢任何帮助,我提前感谢您的时间。

1 个答案:

答案 0 :(得分:2)

if({addressType: req.params.id} != req.body.addressType)

您将对象与字符串进行比较。它总是not equals

if (address) {
  update();
} else {
  create();
}

最好使用upsert选项:

Address.findOneAndUpdate({address_id: req.params.id}, req.body, {
  upsert: true
}, callback);

Documentation