Сохранить объекты в поле типа массива в mongoose - PullRequest
0 голосов
/ 12 июня 2018

Я хочу сохранить мой массив объекта car в моем поле user.cars в mongoose.

Моя схема пользователя выглядит следующим образом:

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 сохраняет данные в виде нового массива, поэтому выглядитthis:

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

Но я хочу получить user.cars в виде массива объектов вместо передачи нового массива в автомобили.

Большое спасибо за помощь в поиске, где я допустил ошибку вмой код.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

На самом деле вам не нужно искать пользователя и сохранять его снова, вместо этого вы можете использовать оператор $ 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))
  })
0 голосов
/ 12 июня 2018

В вашей модели схемы вы определяете тип cars как Array.Вот почему он сохраняет данные, такие как структура массива.

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

Вместо этого создайте четкую схему полей:

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

Это исправит ваши данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...