将对象保存到mongoose中的数组类型字段

时间:2018-06-12 10:18:46

标签: node.js mongodb mongoose

我想将我的car对象数组保存到mongoose中的user.cars字段。

我的用户架构如下所示:

const UserSchema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    cars: [{
        type: Array,
        required: false
    }]
})

我将用户汽车保存在汽车终端上,如下所示:

router.route('/cars')
  .post(async function (req, res) {
    User.findById(req.user._id)
      .then((user, err) => {
        if (err) {
           return res.json({err})
        }
        if (user && user._id) {
           user.cars = req.body.cars 
           user.save(function (err) {
             if (err) {
                res.status(500)
                return res.json({
                   success: false,
                   message: err.message || 'Update failed'
                  })
             }
             ioServer.sockets.emit('update-users')
             res.status(200).json({
                success: true,
                message: 'User updated successfully'
             })
           })
        } else {
          return res.json({message: 'No user', success: false})
        }
      })
      .catch(err => console.log(err))
  })

我的req.body日志如下:

{ cars: [
    {
        type: 'Sedan',
        make: 'BMW',
        model: '525i',
        [...]
    },
    {
        type: 'Coupe',
        make: 'Subaru',
        model: 'BRZ',
        [...]
    },
    {
        type: 'SUV',
        make: 'Toyota',
        model: 'Rav4',
        [...]
    }
    ]
}

此代码有效,但是mongoose将数据保存为新数组,因此它看起来像这样:

{ user.cars: [
    [
        {car},
        {car},
        ...
    ]
]}

但是我希望将user.cars作为一个对象数组,而不是将新数组传递给汽车。

非常感谢您帮助我找到我在代码中出错的地方。

2 个答案:

答案 0 :(得分:1)

实际上,您不需要找到用户并再次保存,而是可以使用$push运算符来设置汽车阵列......

router.route('/cars')
  .post(async function (req, res) {
    User.findOneAndUpdate({_id: req.user._id}, {$push: { cars: {$each: req.body.cars}}})
      .then((user, err) => {
        if (err) {
           return res.json({err})
        }
        res.status(200).json({
           success: true,
           message: 'User updated successfully'
        })
      })
      .catch(err => console.log(err))
  })

答案 1 :(得分:0)

在您的模型架构中,您将cars的类型定义为Array。这就是它保存数组结构等数据的原因。

cars: [{
        type: Array,
        required: false
    }]

而是创建一个清晰的字段模式:

    cars: [{
       type: String,
       make: String,
       model: String,
       ...
    }]

这会修复您的数据。