Сохранить объект в массив в другой модели

0

Итак, я получил две модели мангуста:

var mongoose = require('mongoose');
var Schema    = mongoose.Schema;
var eventSchema = new mongoose.Schema({

  name: String,
  date: String,
  dogs: [{ type: Schema.Types.ObjectId, ref: 'Dog' }]

});
module.exports = mongoose.model('Event', eventSchema);

а также

var mongoose = require('mongoose');
var Schema    = mongoose.Schema;
var dogSchema = new mongoose.Schema({

  name: String,
  age: String,
  gender: String,

});
module.exports = mongoose.model('Dog', dogSchema);

Event содержит массив dogs и им пытается выяснить, как добавить/удалить собак в этот массив.

На клиенте я получил этот метод:

  $.ajax({
     url: "http://localhost:3000/api/events/",
     dataType: 'json',
     type: 'POST', // Not sure if I should Post or Put...
     data: {event_Id : this.props.choosenEvent._id, //Here I got the Id of the Event that i want to update by
            dog_Id : this.props.events[dog]._id }, //adding this dog, which Id is here
     success: function(data) {

     }.bind(this),
   });
 },

На сервере NodeJs я получил свои маршруты к API. Для меня имеет смысл использовать PUT-метод и начать с получения правильного события с событием event_Id, переданным как параметр. Что-то вроде:

router.route('/events/:event_id')
    .put(function(req, res) {


        Event
        .findById({ _id: req.param.event_id })
        .populate('dogs')

        });

Но я застрял на этом. Любая помощь оценивается. Благодарю!

Обновить!

Спасибо! Ваш код очень помог, вы использовали lodash.remove, чтобы удалить собаку из массива, есть ли аналогичный способ добавить элемент с lodash?

Я дал метод добавления:

router.route('/events')   
      .post(function(req, res) {
          // Your data is inside req.body

          Event
              .findById({ _id: req.body.event_Id })
              // execute the query
              .exec(function(err, eventData) {
                  // Do some error handing
                  // Your dogs are inside eventData.dogs
                  eventData.dogs.push(req.body.dog_Id);
                  console.log(eventData)

                });
                  // Update your eventDate here
                  Event.update({_id: req.body.event_id}, eventData)
                      .exec(function(err, update) {
                          // Do some error handing
                          // And send your response
                      });
              });

Когда я нахожусь в console.log(eventData) я вижу, что dog_id добавляется в массив, как и должно быть. Однако он не сохраняется в db, и ошибка говорит о том, что eventData не определен в Event.Update. Я подозреваю, что это проблема Js-scope.

Onte вещь, которая поражает меня, такова:

Очевидно, я хотел бы иметь возможность добавлять и удалять собак из массива, и маршрут router.route('/events'): router.route('/events').

Но если оба метода add и метода remove находятся на одном и том же пути, как код может узнать, для чего я собираюсь?

Теги:
mongoose

1 ответ

1
Лучший ответ

Есть несколько ошибок, которые вы делаете. Прежде всего, вы делаете запрос POST, но ваш маршрут принимает запрос PUT. Я обновил ваш код, чтобы он принял POST.

При публикации объектов ваши данные находятся внутри req.body. req.params используется для параметров URL. Это также имеет место при использовании запроса PUT.

Население собак действительно не нужно. Вы отправляете свою собаку в свою функцию, чтобы вы могли удалить свой элемент из своего массива, который удаляет вашу собаку из вашего мероприятия. Это должно сделать трюк. Обратите внимание, что это не удаляет вашу собаку из вашей базы данных, а только из вашего мероприятия.

Последний, но тем не менее важный. Я использую lodash. _.remove - функция lodash. Вы обязательно должны это проверить, это вам очень поможет.

Взгляните на мой код. Он должен вас поймать:

router.route('/events/:event_id')
    // Since you are posting, you should use POST from JavaScript instead of PUT
    .post(function(req, res) {
        // Your data is inside req.body
        Event
            .findById({ _id: req.body.event_id })
            // execute the query
            .exec(function(err, eventData) {
                // Do some error handing
                // Your dogs are inside eventData.dogs
                _.remove(eventData.dogs, function(d) {
                    return d._id === req.body.dog_Id;
                });
                // Update your eventDate here
                Event.update({_id: req.body.event_id}, eventData)
                    .exec(function(err, update) {
                        // Do some error handing
                        // And send your response
                    });
            });

        });

ОБНОВЛЕНИЕ:

Я не думаю, что есть способ добавить элементы в массив с lodash, но вы можете просто использовать push, как это было в вашем примере кода. Это работает отлично.

Ваше обновление не работает, потому что вы одновременно выполняете findById и обновляете. Вам нужно будет сначала найти элемент, добавить идентификатор и THEN обновить элемент :) Переместить функцию обновления внутри обратного вызова вашей функции findById, и это должно быть исправлено. Так выглядит:

router.route('/events')   
    .post(function(req, res) {
        // Your data is inside req.body

        Event
        .findById({ _id: req.body.event_Id })
        // execute the query
        .exec(function(err, eventData) {
            // Do some error handing
            // Your dogs are inside eventData.dogs
            eventData.dogs.push(req.body.dog_Id);
            console.log(eventData)

            // Update your eventDate here
            Event.update({_id: req.body.event_id}, eventData)
            .exec(function(err, update) {
                // Do some error handing
                // And send your response
            });
        });
    });

Вы можете добавлять разные функции по одному и тому же маршруту, пока метод отличается от других. Взгляните на REST на этот ответ. У вас могут быть GET, POST, PUT & DELETE on/events. Это определяется следующим правилом:

router.route('/events').post();
  • 0
    Большое спасибо! Вы точно поставили меня на правильный путь. Пожалуйста, посмотрите на обновление, если можете.
  • 0
    @ user2915962 Я обновил свой ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню