所以我有两个猫鼬模型:
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都在同一条路线上,代码怎么知道我要去哪一个?
答案 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();