[英]Removing Objects in one-to-many relationships using Node.js REST API, Mongoose, Express, Angular,
我在 Tickets(many) 和 Events(one) 之间有一对多的关系。 我可以将票添加到活动中,但是当我删除该票时,我也希望将其从活动中删除。 到目前为止,我还没有能够用下面的代码来完成这个。 我可以删除票,但它仍然在 Event 对象中被引用。
票务控制器(删除功能) OLD
exports.delete = function (req, res) {
// Find Ticket using ID from URL
var ticket = Ticket.findById(req.params.ticketId, function (err, data) {
if (err) {
res.status(500).send({
message: "Could not retrieve event with id " + req.params.ticketId
});
} else {
return data;
}
});
//Use ticket linkedEvent Id to find and update Event
Event.update( {"_id": ticket.linkedEvent}, { "$pullAll": {"tickets": [req.params.ticketId] } } );
//Delete Ticket and send back success message
Ticket.remove({
_id: req.params.ticketId
}, function (err, data) {
if (err) {
res.status(500).send({
message: "Could not delete ticket with id " + req.params.id
});
} else {
res.send({
message: "Ticket deleted successfully!"
});
}
});
};
工单架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var TicketSchema = mongoose.Schema({
type: String,
name: String,
expirationDate: String,
reward: String,
image: String,
rewardUnlocked: Boolean,
redeemed: Boolean,
linkedEvent: String,
scannedCodes: [],
unlockCodes: []
}, {
timestamps: true
});
module.exports = mongoose.model('Ticket', TicketSchema);
事件架构
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var EventSchema = mongoose.Schema({
promoter: String,
name: String,
location: String,
date: String,
image: String,
attendees: Array,
tickets: [{
type: Schema.Types.ObjectId,
ref: 'Ticket'
}],
}, {
timestamps: true
});
module.exports = mongoose.model('Event', EventSchema);
异步瀑布删除功能NEW
exports.delete = function (req, res, next) {
async.waterfall([
getTicket,
updateEvent,
deleteTicket,
], function (err, result) {
res.send(result);
});
//Get Ticket by Id
function getTicket(req, res, callback) {
Ticket.findById(req.params.ticketId, function (err, data) {
if (err) {
res.status(500).send({
message: "Could not retrieve event with id " + req.params.ticketId
});
} else {
callback(null, data);
}
});
}
//Delete Ticket ref from Event
function updateEvent(callback) {
Event.update({
"_id": callback.linkedEvent
}, {
"$pullAll": {
"tickets": [req.params.ticketId]
}
});
next();
}
//Delete Ticket
function deleteTicket(callback) {
Ticket.remove({
_id: req.params.ticketId
}, function (err, data) {
if (err) {
res.status(500).send({
message: "Could not delete ticket with id " + req.params.id
});
} else {
callback(null, {
message: "Ticket deleted successfully and removed from Event!"
});
}
});
}
};`
我和你一样遇到了同样的问题,所以你唯一需要的是在删除子文件时更新父文档:
// remove child document and pick its id and parent_id
await Event.findByIdAndUpdate(event_id, {
$pull: { tikets: tiket_id },
});
顺便说一下,您需要在子架构中引用对父架构的引用,如下所示:
var TicketSchema = mongoose.Schema({
// ...other properties
event: {
type: Schema.Types.ObjectId,
ref: 'Event'
}
}, {
timestamps: true
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.