将对象保存到另一个模型中的数组

时间:2015-09-28 13:24:59

标签: javascript ajax node.js mongoose reactjs

所以我有两个猫鼬模型:

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),
   });
 },

在服务器NodeJ上,我获得了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添加一个项目?

我给add方法这样:

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被添加到数组中。但是它不会保存到数据库中,并且错误表明eventData中未定义Event.Update。我怀疑这是一个Js-scope问题。

让我感到困惑的是:

显然我希望能够从阵列中添加和删除狗 路线是这样的:router.route('/events')

但是如果add-method和remove-method都在同一条路线上,代码怎么知道我要去哪一个?

1 个答案:

答案 0 :(得分:1)

你犯了一些错误。首先,您正在发出 POST 请求,但您的路由接受 PUT 请求。我已更新您的代码,因此它接受了POST。

发布对象时,您的数据位于 req.body 中。 req.params 用于url参数。使用PUT请求时也是如此。

填充并不是必需的。您正在将dog_id发送到您的功能,以便您可以从阵列中删除您的项目,从您的活动中删除您的狗。这应该可以解决问题。请注意,这不会将您的狗从您的数据库中删除,而只会从您的活动中删除。

最后但并非最不重要。我正在使用lodash _。删除是一个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并同时更新。你必须先找到项目,添加id,然后更新项目:)在你的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
            });
        });
    });

只要方法与其他方法不同,您就可以在同一路线上添加不同的功能。看看这个answer的REST。您可以拥有 GET POST PUT &amp; / events 上的 DELETE 。这由以下规则定义:

router.route('/events').post();