繁体   English   中英

使用 Node.js REST API、Mongoose、Express、Angular 删除一对多关系中的对象,

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM