Не существует автоматического c способа удаления автомобилей у пользователя при его удалении. Таким образом, вам нужно выполнить операцию с обоими документами.
Но есть более простой способ с использованием только родительских ссылок. Не сохраняйте ссылки на автомобили в пользовательской модели и используйте виртуальное заполнение для заполнения автомобилей от пользователя.
Вот шаги:
1-) Измените вашу пользовательскую схему для настройки виртуального заполнения:
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
let UserSchema = new Schema(
{
name: String,
age: Number,
},
{
toJSON: { virtuals: true },
}
);
UserSchema.virtual("cars", {
ref: "Car",
localField: "_id",
foreignField: "owner",
});
const User = mongoose.model("User", UserSchema);
Обратите внимание, что я удалил поле cars, добавил опцию toJSON: { virtuals: true }
в схему, настроил virtual. (также изменил тип возраста как Number).
2-) Теперь мы можем создать пользователя и автомобиль следующим образом:
router.post("/users", async (req, res) => {
const user = new User({ name: "Raj", age: 50 });
try {
await user.save();
const car1 = new Car({
make: "Toyota",
model: "568",
owner: user._id,
});
await car1.save();
res.send("User and car saved");
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
Как видите, нам потребовалось 2 дБ вместо 3, поскольку нам не нужно отправлять sh машину на машины пользователя и сохранять.
3-) Теперь мы можем заполнить автомобили пользователя с помощью команды populate:
router.get("/users/:id", async (req, res) => {
try {
const user = await User.findById(req.params.id).populate("cars");
res.send(user);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
Это будет дать вывод:
{
"_id": "5ea685a3f1a0b02db8aaffe2",
"name": "Raj",
"age": 50,
"__v": 0,
"cars": [
{
"_id": "5ea685a5f1a0b02db8aaffe3",
"make": "Toyota",
"model": "568",
"owner": "5ea685a3f1a0b02db8aaffe2",
"__v": 0
}
],
"id": "5ea685a3f1a0b02db8aaffe2"
}