Closed Jasper-Joe closed 4 years ago
As with your other issue, could you show some code where you're trying to delete the mongodb object?
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const mongo4j = require("mongo4j");
const reservationSchema = mongoose.Schema({
_id: { type: mongoose.Schema.Types.ObjectId, neo_prop: true },
employee: {
type: mongoose.Schema.Types.ObjectId,
ref: "Employee",
required: true,
neo_prop: true,
neo_rel_name: "Made by",
},
});
reservationSchema.plugin(mongo4j.plugin());
module.exports = mongoose.model("Reservation", reservationSchema);
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const mongo4j = require("mongo4j");
const employeeSchema = mongoose.Schema({
_id: { type: mongoose.Schema.Types.ObjectId, neo_prop: true },
name: { type: String, required: true, neo_prop: true },
employee_id: { type: String, required: true, neo_prop: true },
currentSeat: { type: String },
});
employeeSchema.plugin(mongo4j.plugin());
module.exports = mongoose.model("Employee", employeeSchema);
I send a delete request like on postman: http://localhost:5000/employees/5f02449bcb1902160f60dbd8
The employee that I deleted was still there in neo4j database as a node. I am not sure where went wrong. Thanks for your reply!
How do you delete the employee after you sent the request, guess you have an endpoint that handles that request? Could you show me the code of that part?
PS. you don't need to add neo_prop: true
to _id
, this will be added automatically if you add the plugin to the schema. (this will be saved as m_id
in neo4j).
Hi, I really appreciate your reply. It is very helpful. Here is the router for deletion of employees. Seems like the data is deleted in mongodb, but not in neo4j. Any suggestions on that? Thanks!
router.delete("/:employee_id", (req, res, next) => {
const id = req.params.employee_id;
Employee.remove({ _id: id })
.exec()
.then((result) => {
res.status(200).json({
message: "Employee account deleted",
request: {
type: "POST",
url: "http://localhost:3000/employees",
body: { name: "String", employee_id: "String" },
},
});
})
.catch((err) => {
console.log(err);
res.status(500).json({
error: err,
});
});
});
module.exports = router;
As I thought, you're deleting it by using the Model. This won't trigger the hook that deletes the node in neo4j as described in the documenation of mongoose:
Like Model.remove(), this function does not trigger pre('remove') or post('remove') hooks.
I will mark this as an enhancement and may look into implementing the deletion in neo4j for the Schema.remove()
function like you used it. For now this change should fix your problem:
router.delete("/:employee_id", (req, res, next) => {
const id = req.params.employee_id;
Employee.findById(id)
.exec()
.then((employee) => employee.remove())
.then((result) => {
res.status(200).json({
message: "Employee account deleted",
request: {
type: "POST",
url: "http://localhost:3000/employees",
body: { name: "String", employee_id: "String" },
},
});
})
.catch((err) => {
console.log(err);
res.status(500).json({
error: err,
});
});
});
module.exports = router;
I haven't tested this code so let me know if you still have any issues. But what it basically does, is finding the model in the database first, which should return a prototype/instance of a Model/Document on which you can call remove()
. This will trigger the hooks I created for removing it in neo4j as well.
Thanks a lot! Now it is working perfectly. You really saved my life. Thank you for your great project, it really helps me a lot. Keep it up!
How do I fix it? Thanks!