Javascript Mongoose一对多关系问题
我有一个用户模型和一个汽车模型。一个用户可以有多辆车。这是代码-Javascript Mongoose一对多关系问题,javascript,mongodb,express,mongoose,Javascript,Mongodb,Express,Mongoose,我有一个用户模型和一个汽车模型。一个用户可以有多辆车。这是代码- 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({
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)
我正在创建一个用户和一个汽车模型,并将用户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()
})
这是可行的,但如果我需要对一个汽车模型执行操作,那么它显然不会反映在用户汽车阵列上,我必须单独执行,即模型没有“实际”链接。我如何使其能够在汽车模型上执行类似删除的操作,从而自动将其从我的用户汽车阵列中删除。任何帮助都将不胜感激。当车辆被移除时,用户无法自动删除车辆。 因此,您需要对这两个文档进行操作 但是有一种更简单的方法,只使用父引用。不要在用户模型中保留汽车参考,并使用从用户模型中填充汽车 以下是步骤: 1-)更改用户架构以设置虚拟填充:
var mongoose=require(“mongoose”);
var Schema=mongoose.Schema;
让UserSchema=newschema(
{
名称:String,
年龄:数字,,
},
{
toJSON:{virtuals:true},
}
);
UserSchema.virtual(“汽车”{
参考:“汽车”,
localField:“\u id”,
外域:“所有者”,
});
const User=mongoose.model(“User”,UserSchema);
注意,我删除了cars字段,在模式setup virtual中添加了toJSON:{virtuals:true}
选项。(还将年龄类型修改为数字)
2-)现在我们可以创建这样的用户和汽车:
router.post(“/users”),异步(req,res)=>{
const user=新用户({姓名:“Raj”,年龄:50});
试一试{
等待user.save();
const car1=新车({
制造:“丰田”,
型号:“568”,
所有者:用户。\u id,
});
等待car1.save();
res.send(“用户和车辆已保存”);
}捕捉(错误){
控制台日志(err);
res.status(500)。发送(“出错”);
}
});
正如你所看到的,我们需要2分贝的操作,而不是3分贝,因为我们不需要把车推到用户的车上并保存
3-)现在,我们可以使用“填充”从用户处填充汽车:
router.get(“/users/:id”),异步(req,res)=>{
试一试{
const user=wait user.findById(req.params.id).populate(“cars”);
res.send(用户);
}捕捉(错误){
控制台日志(err);
res.status(500)。发送(“出错”);
}
});
这将提供以下输出:
{
"_id": "5ea685a3f1a0b02db8aaffe2",
"name": "Raj",
"age": 50,
"__v": 0,
"cars": [
{
"_id": "5ea685a5f1a0b02db8aaffe3",
"make": "Toyota",
"model": "568",
"owner": "5ea685a3f1a0b02db8aaffe2",
"__v": 0
}
],
"id": "5ea685a3f1a0b02db8aaffe2"
}
非常感谢!现在需要明确的是,我只需要在用户模型中的cars数组上执行操作,就可以在将来创建/删除/更新任何汽车,而无需在其他地方,对吗?@SushmitChakraborty不,您只需要在cars集合中添加、删除或删除汽车。我猜答案中的输出让你困惑,输出是人口的结果。