[英]Mongoose one to many relationship issue
我有一个用户 model 和一辆车 model。 一个用户可以拥有多辆汽车。 这是代码 -
let UserSchema = new Schema({
name:String,
age:String,
cars:[{
type:Schema.Types.ObjectId,
ref:"Car"
}]
})
const User = mongoose.model("User",UserSchema)
let CarSchema = new Schema({
make:String,
model:String,
owner:{
type:Schema.Types.ObjectId,
ref:"User"
}
})
const Car = mongoose.model("Car",CarSchema)
我正在创建一个用户和一辆汽车 model 并将用户 ID 存储在汽车中,反之亦然 -
const user = new User({
_id: new mongoose.Types.ObjectId(),
name:'Raj',
age:50
})
user.save(function(err){
if(err){
console.log(err)
}
const car1 = new Car({
make:'Toyota',
model:'568',
owner:user._id
})
car1.save(function(err){
if(err){
console.log(err)
}
})
user.cars.push(car1)
user.save()
})
这可行,但如果我需要对一辆汽车 model 执行操作,那么它显然不会反映在用户汽车阵列上,我必须单独进行,即模型没有“实际”链接。 我怎样才能做到这一点,以便在 Car model 上执行删除之类的操作会自动将其从我的用户汽车阵列中删除。 任何帮助将不胜感激。
移除汽车后,无法自动从用户那里删除汽车。 所以你需要对这两个文件进行操作。
但是有一种更简单的方法,只有父引用。 不要在用户 model 中保留汽车引用,并使用虚拟填充来填充来自用户的汽车。
以下是步骤:
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 字段,在 schema 中添加了toJSON: { virtuals: true }
选项,设置了 virtual。 (也将年龄类型修改为数字)。
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 db 操作而不是 3,因为我们不需要将汽车推送到用户的汽车并保存。
3-) 现在我们可以使用填充从用户那里填充汽车:
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");
}
});
这将给出 output:
{
"_id": "5ea685a3f1a0b02db8aaffe2",
"name": "Raj",
"age": 50,
"__v": 0,
"cars": [
{
"_id": "5ea685a5f1a0b02db8aaffe3",
"make": "Toyota",
"model": "568",
"owner": "5ea685a3f1a0b02db8aaffe2",
"__v": 0
}
],
"id": "5ea685a3f1a0b02db8aaffe2"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.