2015-09-28 32 views
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數組和IM試圖找出如何添加/刪除狗給這個陣列。

在客戶端上我得到了這個方法:

$.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。刪除數組中的狗,是否有類似的方式來添加一個項目與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範圍問題。

是博格爾斯我

Onte事情是這樣的:

很顯然,我希望能夠添加和刪除陣列和 路線狗是這樣的:router.route('/events')

但是,如果add-method和remove-method都在同一條路徑上,那麼代碼如何知道我要去哪?

回答

1

您正在犯的一些錯誤。首先,您要發送POST請求,但您的路由接受PUT請求。我已更新您的代碼,以便它接受POST。

發佈對象時,您的數據位於req.body之內。 req.params用於url參數。使用PUT請求時也是如此。

填充是不是真的有必要。您正在將您的dog_id發送到您的功能,以便您可以從陣列中刪除您的項目,從而將您的狗從您的事件中移除。這應該做的伎倆。請注意,這不會將您的狗從您的數據庫中移除,而只會從您的活動中移除。

最後但並非最不重要。我正在使用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 
        }); 
      }); 

     }); 

UPDATE

我不認爲有一種方法將項目添加到與lodash一個數組,但你可以簡單地使用就像你在做你的代碼示例。這工作得很好。

您的更新無效,因爲您正在執行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。你可以有一個GETPOSTPUT & /事件 DELETE。這是由此規則定義的:

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

非常感謝!你把我放在正確的軌道上。如果可以,請查看更新。 – user2915962

+0

@ user2915962我已經更新了我的答案。 –

+1

非常感謝!這篇文章對我來說會派上用場。 – user2915962

相關問題